Chapter overview

In this chapter, I focus on the second of my three key questions about the development of representations of mental life: How are the conceptual units that anchor representations of mental life organized in relation to each other, and how does this organization change over development? As in Chapter III, to address this question I draw on data from all of the current studies (Studies 1-4); for details about the methods of these studies, see Chapter II. The goal of this chapter is to provide “snapshots” of the organization of conceptual units in early childhood, middle childhood, and adulthood.

General analysis plan

High-level overview

My goal in this chapter is to examine the relationships among the “conceptual units” identified in Chapter III. How does a participant’s assessment of one conceptual unit for a particular target character (e.g., the degree to which he or she indicates that a beetle is capable of the physiological sensations of the BODY) affect that participant’s assessments of other conceptual units for that target character (e.g., his or her assessment of the beetle’s capaciteis in the domains of HEART or MIND)?

I focus in particular on the possibility that the mental capacity attributions documented by the studies included in this dissertation—re-analyzed as indicators of the broader “conceptual units” identified in Chapter III—might shed light on the hierarchical organization of these conceptual units, i.e., which conceptual units might be more basic or fundamental vs. more complex, and whether any of these conceptual units might or might not be considered to depend on the presence of others. In Chapter II, I illustrated this with the following example: If many participants endorse capacities associated with Conceptual Unit A without endorsing capacities associated with Conceptual Unit B, but very few participants do the reverse (endorsing capacities associated with Conceptual Unit B but not Conceptual Unit A), this provides some evidence that Conceptual Unit A is more basic or fundamental than Conceptual Unit B, or that Conceptual Unit B somehow depends on (perhaps requires) Conceptual Unit A.

Here I will translate this general interest in the relationships among conceptual units, as well as the specific intuition about how to detect the kinds of asymmetries that would be the signature of hierarchical relationships, into a specific analysis plan to be applied to each of these datasets in turn.

Details of analyses

Unlike the previous chapter, in which I employed a canonical approach to identifying latent constructs through analyses of correlation structures—exploratory factor analysis (EFA)—in this chapter there is no tried-and-true method for meeting my analysis goals. Instead, I chart my own course through these datasets, using the EFA solutions reported in Chapter II to score participants’ endorsements of each conceptual unit for the particular target character(s) that they assessed, examining visualizations of the complicated relationships among these endorsements, and then conducting more targeted statistical analyses of one particular aspect of these relationships: the possibility of asymmetries in the endorsements of these conceptual units.

Scoring endorsements of conceptual units

The first step in these analyses is to transform participants’ ratings of individual mental capacities into “scores” that indicate the extent to which they endorsed a particular conceptual unit for the target character(s) that they were assigned to assess. To do this, I make use of the EFAs presented in Chapter II—which originally served to identify a set of conceptual units in a particular sample—to a new end: the construction of “scales” for each of these conceptual units. Scale construction is a common use of EFA and similar dimensionality reduction analyses (if anything, more common than using EFA to make the kinds of theoretical arguments featured in Chapter II).

For each EFA solution, I construct a scale for each of the factors (conceptual units) identified by that solution. First, I sort each of the mental capacities included in that study into categories based on their loadings on each of the factors in that solution. For each mental capacity, I identify the “dominant” factor as the factor with the largest positive factor loading. For example, if the mental capacity feel happy had loadings of 0.60 on the BODY factor, 0.70 on the HEART factor, and 0.30 on the MIND factor, I would sort it into the HEART category. For each factor, I take the six highest-loading items as a candidate scale, then “drop” the capacities with the smallest factor loadings on their respective dominant factors until I have the same number of mental capacities in each category. For example, if the BODY factor were the dominant factor for nine mental capacities, the HEART factor for six mental capacities, and the MIND factor for five capacities, for each factor I would keep only the capacities with the five highest positive loadings on that factor, in order to construct three scales of equal length (and a maximum length of six items).

To calculate scores on these scales, I take the average of all of mental capacities for each scale. This yields a dataset in which each participant is associated with one score for each of the conceptual units identified in the relative EFA solution, for each of the target characters that that participant assessed.

In this chapter, I apply this method to all of the three-factor solutions for adult samples as presented in Chapter II (Studies 1-4), yielding BODY, HEART, and MIND scores for each target character as assessed by each participant. (I ignore the aberrant four-factor solution for adults in Study 2 suggested by one of the three factor retention protocols considered in that chapter, since this was the only study out of the seven considered in which a four-factor solution appeared to add any value beyond the robust BODY-HEART-MIND framework common to all studies. [XX APPENDIX B?])

For child samples, I apply this method both to the solutions emerging from children’s own data and to the corresponding adult solutions for the studies in question. This allows me to explore both the relationships among children’s own conceptual units, and the relationships among a fully adult-like set of conceptual units (presumably, the conceptual units that these children will eventually come to agree on as they mature into adults).

For “older” children (7-9y of age; Studies 2 and 3), this means examining two sets of three conceptual units for each sample of children: (1) BODY, HEART, and MIND as defined by adults in that study; and (2) BODY, HEART, and MIND as defined by the children themselves. Because the EFAs for older children and adults are so similar (see Chapter II), I expect the outcomes of these two approaches to constructing BODY, HEART, and MIND scales to yield very similar results in this age group.

For “younger” children, this means examining multiple sets of conceptual units for each sample of children, including (1) BODY, HEART, and MIND as defined by adults in that study; and (2) varying sets of 2-4 conceptual units as defined by EFA of children’s own responses, using different factor retention protocols. The EFAs of younger children’s responses were less reliable, and less adult-like, than those of older children. As a consequence, I expect the outcomes of these different approaches to constructing scales for each conceptual unit to yield rather different results in this age group.

The reader should note that this is far from the only way to approach “scoring” participants on these conceptual units. In particular, I could have examined factor scores—summaries of each factor (conceptual unit) based on a participant’s responses to all mental capacities and the relationships between all mental capacities and all factors included in that EFA solution—rather than constructing “scales” in the way I have just outlined. However, much like z-scores, factor scores indicate where a participant falls in relation to other participants in the sample, and do not provide the kind of absolute score that is key to my goal in this chapter, which is to analyze relationships among factors in terms of the extent to which individual participants indicated that target characters “possessed” the conceptual units BODY, HEART, and MIND. [XX APPENDIX B?]

Even within the “scale” approach described in this section, there are many parameters of this analysis that I could have set differently. For example, I could have considered absolute factor loadings rather than raw factor loadings, which would allow for mental capacities that loaded especially strongly negatively on a particular factor to contribute (negatively) to scores on that conceptual unit; I could have omitted the step of making the scales for all factors within a single EFA sotluion equal length; I could have chosen to use only the top 4 or 5 mental capacities across all EFA solutions, or to set no limit on the number of items in a scale; or I could have implemented absolute thresholds for how strongly a mental capacity must load on a factor in order to count toward the score for that conceptual unit, or absolute limits on the degree to which a mental capacity can “cross-load” on non-dominant factors and still count toward the score for any one conceptual unit. [XX APPENDIX B?] However, these kinds of details differ quite dramatically across studies and age groups. For example, in some samples there are no strong negative factor loadings, and in others there are; if I considered absolute loadings rather than raw loadings, I could end up comparing scores from a “bipolar” scale in one sample to scores from a “unipolar” scales in another sample, making the comparison more difficult to interpret. Likewise, some EFA solutions tended to feature generally weaker factor loadings than others; if I were to impose absolute thresholds for the strength of factor loadings, I could end up comparing scores from scales of wildly different lengths across samples. In my view, the analysis decisions outlined above maximize comparability across studies and age groups—the primary goal of this chapter. (Note, however, that in the analysis code for this chapter I have included easy short cuts for the interested reader to explore different options for each of these parameters.)

Visualizing relationships

XX

outline:

  • for any sample, I have identified relevant conceptual units (chapter II) and scored each participant’s endorsement of each of these units for their assigned target character(s) (previous section)
  • now, I want to assess the relationships among these endorsements
  • but I don’t really know what to expect, and these relationships could be very complex
  • so, start with holistic, exploratory visualization: scatterplots of pairs of conceptual units

Targeting the possibility of asymmetries

XX

outline:

  • now, a more targeted approach to one particular aspect of these relationships: asymmetries
  • reminder of basic intuition: in this sample, do participants tend to endorse A without B? B without A? is there an asymmetry here?
  • connect to the visualizations: asymmetries of points around the y=x line of equivalence
  • one way to boil this down to a number: difference scores (for each pair), comparisons to 0 via bayesian regressions
    • for any pair: if 0, no evidence for hierarchy. if non-zero, some evidence.
    • comparisons across pairs: further from 0, more hierarchical.
    • caveat 1: these are post-hoc analyses! but still using confirmatory stats.
    • caveat 2: scores of (0,0) treated same as scores of (6,6), or anywhere in between.

Study 1: An adult endpoint

In the context of this dissertation, Study 1 serves the role of describing a developmental endpoint for conceptual representations of mental life. In this chapter, I focus on what these studies can reveal about the relationships among the conceptual units discussed in Chapter III. These analyses were not part of the original publication of these studies (Weisman et al., 2017).

Special notes on data processing and analysis

As noted in Chapter II, in the original analysis of these datasets responses were recoded to run from -3 to +3 before analyses (Weisman et al., 2017); in this dissertation, I maintain the 0-6 coding for comparability to Studies 2-4.

Results

Study 1a

In Study 1a, 405 US adults each assessed a single target character on 40 mental capacities. This study employed the “edge case” variant of the general approach, with participants randomly assigned to assess either a beetle or a robot. (See Chapter II and Weisman et al., 2017, for detailed methods.)

Scale construction

Following the steps described in “General analysis plan,” above, yielded BODY, HEART, and MIND scales of 6 items each; see Table 4.1.

Visualization

XX

Analysis of asymmetries

XX

Study 1b

Study 1b was a direct replication of Study 1a: 406 US adults each assessed a single target character (either a beetle or a robot) on 40 mental capacities. (See Chapter II and Weisman et al., 2017, for detailed methods.)

Scale construction

Following the steps described in “General analysis plan,” above, yielded BODY, HEART, and MIND scales of 6 items each; see Table 4.1.

Visualization

XX

Analysis of asymmetries

XX

Study 1c

In Study 1c, 200 US adults each assessed two target characters on 40 mental capacities. Like Studies 1a and 1b, this study employed the “edge case” variant of the general approach; but in this study, all participants assessed both of these target characters side by side (with left-right position counterbalaned across participants). (See Chapter II and Weisman et al., 2017, for detailed methods.)

Scale construction

Following the steps described in “General analysis plan,” above, yielded BODY, HEART, and MIND scales of 6 items each; see Table 4.1.

Visualization

XX

Analysis of asymmetries

XX

Study 1d

In Study 1d, 431 US adults each assessed a single target character on 40 mental capacities. Unlike Studies 1a-1c, this study employed the “many characters” variant of the general approach, in which participants were randomly assigned to assess one of the following 21 target characters: an adult, a child, an infant, a person in a persistent vegetative state, a fetus, a chimpanzee, an elephant, a dolphin, a bear, a dog, a goat, a mouse, a frog, a blue jay, a fish, a beetle, a microbe, a robot, a computer, a car, or a stapler. (See Chapter II and Weisman et al., 2017, for detailed methods.)

Scale construction

Following the steps described in “General analysis plan,” above, yielded BODY, HEART, and MIND scales of 6 items each; see Table 4.1.

Visualization

XX

Analysis of asymmetries

XX

Discussion

Table 4.1: Scales for each of the conceptual units (factors) identified by EFA for US Adults in Studies 1a-1d (see Chapter III). A checkmark indicates that a mental capacity was included in a scale for a particular study.
Capacity Study 1a Study 1b Study 1c Study 1d
BODY scale
getting hungry
experiencing pain
feeling tired
experiencing fear
experiencing pleasure
having free will
being conscious
having desires
feeling calm
HEART scale
feeling embarrassed
experiencing pride
feeling love
experiencing guilt
holding beliefs
feeling disrespected
feeling depressed
telling right from wrong
MIND scale
remembering things
recognizing someone
sensing temperatures
communicating with others
seeing things
perceiving depth
detecting sounds
working toward a goal
making choices

XX

Study 2: Conceptual change between middle childhood (7-9y) and adulthood

In Study 2, 200 US adults and 200 US children between the ages of 7.01-9.99 years (median: 8.31y) each assessed a single target character on 40 mental capacities. To make the study appropriate for children in this age range, the wording of some the 40 mental capacities employed in Study 1 was modified to use more age-appropriate vocabulary, and participants responded on a 3-point scale (“no,” coded as 0; “kinda,” coded as 0.5, “yes,” coded as 1). This study employed the “edge case” variant of the general approach, with participants randomly assigned to assess either a beetle or a robot. (See Chapter II for detailed methods.)

Special notes on data processing and analysis

Results

Adults

Scale construction

Following the steps described in “General analysis plan,” above, yielded BODY, HEART, and MIND scales of 6 items each; see Table 4.2.

Visualization

XX

Analysis of asymmetries

XX

Children (7-9y)

Scale construction

Following the steps described in “General analysis plan,” above, yielded BODY, HEART, and MIND scales of 6 items each; see Table 4.2.

Visualization

Using adults’ scales

XX

Using children’s own scales

XX

Analysis of asymmetries

XX

Discussion

XX

Table 4.2: Scales for each of the conceptual units (factors) identified by EFA for US Adults and children in Study 2 (see Chapter III). A checkmark indicates that a mental capacity was included in a scale for a particular sample.
Capacity Adults Children, 7-9y
BODY scale
get hungry
feel pain
feel scared
feel tired
feel safe
smell things
feel sick...
HEART scale
feel proud
feel joy
feel sad
feel happy
feel love
feel guilty
get hurt feelings
MIND scale
figure out how to do things
make choices
recognize somebody else
sense...far away
remember things
see things
be aware of itself
be aware of things
sense temperatures

Study 3: Conceptual change over early and middle childhood (4-9y)

In Study 3, 116 US adults, 125 “older” children (7.08-9.98 years; median: 8.56y), and 124 “younger” children (4-6.98 years; median: 5.03y) each assessed a single target character on 20 mental capacities. To make the study appropriate for children in this age range, participants assessed a subset of the 40 mental capacities employed in Study 2, chosen to represent the three “conceptual units” revealed by Studies 1-2 (BODY, HEART, and MIND) and to cover a similar range of mental capacities as Studies 1-2. As in Study 2, participants responded on a 3-point scale (“no,” coded as 0; “kinda,” coded as 0.5, “yes,” coded as 1). This study employed the “diverse characters” variant of the general approach, with participants randomly or pseudo-randomly assigned to assess either one of the following 9 characters: an elephant, a goat, a mouse, a bird, a beetle, a teddy bear, a doll, a robot, or a computer. (See Chapter II for detailed methods.)

Special notes on data processing and analysis

Results

Adults

Scale construction

Following the steps described in “General analysis plan,” above, yielded BODY, HEART, and MIND scales of 6 items each; see Table 4.3.

Visualization

XX

Analysis of asymmetries

XX

Children (7-9y)

Scale construction

Following the steps described in “General analysis plan,” above, yielded BODY, HEART, and MIND scales of 6 items each; see Table 4.3.

Visualization

Using adults’ scales

XX

Using children’s own scales

XX

Analysis of asymmetries

XX

Children (4-6y)

Scale construction

Three-factor solution

Following the steps described in “General analysis plan,” above, yielded BODY*, HEART*, and MIND scales of 5 items each; see Table 4.3.

Two-factor solution

Following the steps described in “General analysis plan,” above, yielded BODY-HEART and MIND scales of 6 items each; see Table 4.3.

Visualization

Using adults’ scales

XX

XX

Using children’s own scales (three-factor solution)

XX

XX

Using children’s own scales (three-factor solution)

XX

XX

Analysis of asymmetries

XX

Discussion

XX

Table 4.3: Scales for each of the conceptual units (factors) identified by EFA for US Adults, older children, and younger children in Study 3 (see Chapter III). For younger children, this includes scales for both three- and two-factor EFA solutions. A checkmark indicates that a mental capacity was included in a scale for a particular sample. The conceptual units of younger children differed substantially from those of older children and adults, such that some mental capacities were included in different scales across age groups (e.g., feel scared was part of the BODY scale for older children and adults, but part of the HEART* scale for younger children). In these cases, the name of the scale is provided (rather than a checkmark).
Younger children, 4-6y
Capacity Adults Older children, 7-9y 3-factor solution 2-factor solution
BODY scale
feel pain
get hungry BODY-HEART
feel tired
smell things
feel scared HEART*
feel sick... BODY-HEART
get angry BODY-HEART
HEART scale
feel happy BODY-HEART
feel guilty MIND MIND
get hurt feelings BODY*
feel embarrassed
feel proud BODY-HEART
feel love
feel sad BODY-HEART
MIND scale
sense...far away
sense temperatures
figure out how to do things
be aware of things
remember things
make choices

Study 4: A focus on early childhood (4-5y)

In Study 4, 104 US adults and 43 US children between the ages of 4.02-5.59 years (median: 4.73y) each assessed two target characters on 18 mental capacities. To make the study appropriate for children in this age range, this study employed a new set of 18 mental capacities (some but not all of which were used in Studies 1-3). In addition, participants were presented with a more child-friendly visual representation of the 3-point response scale (“no,” coded as 0; “kinda,” coded as 0.5, “yes,” coded as 1). This study employed the “edge case” variant of the general approach, with participants assessing both a beetle or a robot in sequence (with order counterbalanced across participants). (See Chapter II for detailed methods.)

Special notes on data processing and analysis

Results

Adults

Scale construction

Following the steps described in “General analysis plan,” above, yielded BODY, HEART, and MIND scales of 5 items each; see Table 4.4.

Visualization

XX

Analysis of asymmetries

XX

Children (4-5y)

Scale construction

Three-factor solution

Following the steps described in “General analysis plan,” above, yielded BODY, HEART, and MIND scales of 3 items each; see Table 4.5.

Four-factor solution

Following the steps described in “General analysis plan,” above, yielded BODY (nausea), BODY (other), HEART*, and MIND* scales of 3 items each; see Table 4.5.

Visualization

Using adults’ scales

XX

Using children’s own scales (three-factor solution)

XX

Using children’s own scales (four-factor solution)

XX

Analysis of asymmetries

XX

Discussion

XX

Table 4.5: Scales for each of the conceptual units (factors) identified by EFA for US Adults and children in Study 4 (see Chapter III). For children, this includes scales for both three- and four-factor EFA solutions. A checkmark indicates that a mental capacity was included in a scale for a particular sample. The conceptual units of younger children differed substantially from those of adults, such that some mental capacities were included in different scales across age groups (e.g., love someone was part of the HEART scale for adults, but part of the MIND* scale in the four-factor solution for younger children). In these cases, the name of the scale is provided (rather than a checkmark).
Children, 4-5y
Capacity Adults 3-factor solution 4-factor solution
BODY scale
get thirsty BODY (other)
feel hungry BODY (other)
smell things BODY (nausea)
feel tired BODY (nausea)
feel sick BODY (nausea)
HEART scale
love someone MIND*
get sad
hate someone
feel sorry
get lonely
MIND scale
figure things out
remember things
know stuff
think
hear BODY (other)

General discussion

XX

Chapter conclusion

In this chapter, I explored a second aspect of conceptual representations of mental life among US children and adults: The relationships among conceptual units. Studies 2-4 are consistent with the following theory: XX.

As in Chapter III, I urge the reader to remember that this is not the only possible interpretation of the pattern of results presented here; additional studies—in particular, studies designed to test the hypothesis that XX— could provide converging evidence or could challenge this theoretical interpretation. Instead, the primary role of the re-analysis discussed here has been to inspire the hypothesis stated in the previous paragraph and to the foundation for future tests of this hypothesis, in turn refining a general theory of this aspect of conceptual development.

In the next chapter, I apply the same exploratory spirit to the third and final aspect of conceptual representations of mental life: the application or deployment of these conceptual units in reasoning about various kinds of beings.

LS0tCnRpdGxlOiAiQ2hhcHRlciBJVjogQ2hhbmdlcyBpbiBvcmdhbml6YXRpb24gb2YgY29uY2VwdHVhbCB1bml0cyIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiA0CiAgICB0b2NfZmxvYXQ6IHllcwphbHdheXNfYWxsb3dfaHRtbDogeWVzCi0tLQoKYGBge3IgZ2xvYmFsX29wdGlvbnMsIGluY2x1ZGUgPSBGfQprbml0cjo6b3B0c19jaHVuayRzZXQoZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDAuNjcsCiAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlID0gRiwgZWNobyA9IEYpCmBgYAoKYGBge3J9CiMgIyBmb3Iga25pdHRpbmcgdG8gLmRvY3gKIyBvdXRwdXQ6CiMgICB3b3JkX2RvY3VtZW50OgojICAgICByZWZlcmVuY2VfZG9jeDogIi4vd29yZC1zdHlsZXMtcmVmZXJlbmNlLmRvY3giCiMgYWx3YXlzX2FsbG93X2h0bWw6IHllcwogICAKIyAjIGZvciBrbml0dGluZyB0byAubmIuaHRtbCAKIyBvdXRwdXQ6CiMgICBodG1sX25vdGVib29rOgojICAgICB0b2M6IHllcwojICAgICB0b2NfZGVwdGg6IDQKIyAgICAgdG9jX2Zsb2F0OiB5ZXMKYGBgCgpgYGB7cn0KIyBydW4gdXItc2V0dXAgc2NyaXB0ICh3aGljaCBydW5zIG90aGVyIHNjcmlwdHMpCnNvdXJjZSgiLi9zY3JpcHRzL19TRVRVUC5SIikKYGBgCgpgYGB7cn0KIyBsb2FkIGluIEVGQXMgZnJvbSBDaGFwdGVyIElJSQojIHN0dWR5IDEKZWZhX3Bhcl9kMWFfYWQgPC0gcmVhZFJEUyhmaWxlID0gIi4vZWZhcy9lZmFfcGFyX2QxYV9hZCIpCmVmYV9iaWNfZDFhX2FkIDwtIHJlYWRSRFMoZmlsZSA9ICIuL2VmYXMvZWZhX2JpY19kMWFfYWQiKQplZmFfd2RtX2QxYV9hZCA8LSByZWFkUkRTKGZpbGUgPSAiLi9lZmFzL2VmYV93ZG1fZDFhX2FkIikKCmVmYV9wYXJfZDFiX2FkIDwtIHJlYWRSRFMoZmlsZSA9ICIuL2VmYXMvZWZhX3Bhcl9kMWJfYWQiKQplZmFfYmljX2QxYl9hZCA8LSByZWFkUkRTKGZpbGUgPSAiLi9lZmFzL2VmYV9iaWNfZDFiX2FkIikKZWZhX3dkbV9kMWJfYWQgPC0gcmVhZFJEUyhmaWxlID0gIi4vZWZhcy9lZmFfd2RtX2QxYl9hZCIpCgplZmFfcGFyX2QxY19hZCA8LSByZWFkUkRTKGZpbGUgPSAiLi9lZmFzL2VmYV9wYXJfZDFjX2FkIikKZWZhX2JpY19kMWNfYWQgPC0gcmVhZFJEUyhmaWxlID0gIi4vZWZhcy9lZmFfYmljX2QxY19hZCIpCmVmYV93ZG1fZDFjX2FkIDwtIHJlYWRSRFMoZmlsZSA9ICIuL2VmYXMvZWZhX3dkbV9kMWNfYWQiKQoKZWZhX3Bhcl9kMWRfYWQgPC0gcmVhZFJEUyhmaWxlID0gIi4vZWZhcy9lZmFfcGFyX2QxZF9hZCIpCmVmYV9iaWNfZDFkX2FkIDwtIHJlYWRSRFMoZmlsZSA9ICIuL2VmYXMvZWZhX2JpY19kMWRfYWQiKQplZmFfd2RtX2QxZF9hZCA8LSByZWFkUkRTKGZpbGUgPSAiLi9lZmFzL2VmYV93ZG1fZDFkX2FkIikKCiMgc3R1ZHkgMgplZmFfcGFyX2QyX2FkIDwtIHJlYWRSRFMoZmlsZSA9ICIuL2VmYXMvZWZhX3Bhcl9kMl9hZCIpCmVmYV9iaWNfZDJfYWQgPC0gcmVhZFJEUyhmaWxlID0gIi4vZWZhcy9lZmFfYmljX2QyX2FkIikKZWZhX3dkbV9kMl9hZCA8LSByZWFkUkRTKGZpbGUgPSAiLi9lZmFzL2VmYV93ZG1fZDJfYWQiKQoKZWZhX3Bhcl9kMl83OSA8LSByZWFkUkRTKGZpbGUgPSAiLi9lZmFzL2VmYV9wYXJfZDJfNzkiKQplZmFfYmljX2QyXzc5IDwtIHJlYWRSRFMoZmlsZSA9ICIuL2VmYXMvZWZhX2JpY19kMl83OSIpCmVmYV93ZG1fZDJfNzkgPC0gcmVhZFJEUyhmaWxlID0gIi4vZWZhcy9lZmFfd2RtX2QyXzc5IikKCiMgc3R1ZHkgMwplZmFfcGFyX2QzX2FkIDwtIHJlYWRSRFMoZmlsZSA9ICIuL2VmYXMvZWZhX3Bhcl9kM19hZCIpCmVmYV9iaWNfZDNfYWQgPC0gcmVhZFJEUyhmaWxlID0gIi4vZWZhcy9lZmFfYmljX2QzX2FkIikKZWZhX3dkbV9kM19hZCA8LSByZWFkUkRTKGZpbGUgPSAiLi9lZmFzL2VmYV93ZG1fZDNfYWQiKQoKZWZhX3Bhcl9kM183OSA8LSByZWFkUkRTKGZpbGUgPSAiLi9lZmFzL2VmYV9wYXJfZDNfNzkiKQplZmFfYmljX2QzXzc5IDwtIHJlYWRSRFMoZmlsZSA9ICIuL2VmYXMvZWZhX2JpY19kM183OSIpCmVmYV93ZG1fZDNfNzkgPC0gcmVhZFJEUyhmaWxlID0gIi4vZWZhcy9lZmFfd2RtX2QzXzc5IikKCmVmYV9wYXJfZDNfNDYgPC0gcmVhZFJEUyhmaWxlID0gIi4vZWZhcy9lZmFfcGFyX2QzXzQ2IikKZWZhX2JpY19kM180NiA8LSByZWFkUkRTKGZpbGUgPSAiLi9lZmFzL2VmYV9iaWNfZDNfNDYiKQplZmFfd2RtX2QzXzQ2IDwtIHJlYWRSRFMoZmlsZSA9ICIuL2VmYXMvZWZhX3dkbV9kM180NiIpCgojIHN0dWR5IDQKZWZhX3Bhcl9kNF9hZCA8LSByZWFkUkRTKGZpbGUgPSAiLi9lZmFzL2VmYV9wYXJfZDRfYWQiKQplZmFfYmljX2Q0X2FkIDwtIHJlYWRSRFMoZmlsZSA9ICIuL2VmYXMvZWZhX2JpY19kNF9hZCIpCmVmYV93ZG1fZDRfYWQgPC0gcmVhZFJEUyhmaWxlID0gIi4vZWZhcy9lZmFfd2RtX2Q0X2FkIikKCmVmYV9wYXJfZDRfNDYgPC0gcmVhZFJEUyhmaWxlID0gIi4vZWZhcy9lZmFfcGFyX2Q0XzQ2IikKZWZhX2JpY19kNF80NiA8LSByZWFkUkRTKGZpbGUgPSAiLi9lZmFzL2VmYV9iaWNfZDRfNDYiKQplZmFfd2RtX2Q0XzQ2IDwtIHJlYWRSRFMoZmlsZSA9ICIuL2VmYXMvZWZhX3dkbV9kNF80NiIpCgojIGxvYWQgaW4gZmFjdG9yIG5hbWVzIGZyb20gQ2hhcHRlciBJSUkKIyBzdHVkeSAxCmZhY3Rvcl9uYW1lc19lZmFfd2RtX2QxYV9hZCA8LSByZWFkUkRTKCAKICAgICAgICBmaWxlID0gIi4vZmFjdG9yX25hbWVzL2ZhY3Rvcl9uYW1lc19lZmFfd2RtX2QxYV9hZCIpCmZhY3Rvcl9uYW1lc19lZmFfd2RtX2QxYl9hZCA8LSByZWFkUkRTKCAKICAgICAgICBmaWxlID0gIi4vZmFjdG9yX25hbWVzL2ZhY3Rvcl9uYW1lc19lZmFfd2RtX2QxYl9hZCIpCmZhY3Rvcl9uYW1lc19lZmFfd2RtX2QxY19hZCA8LSByZWFkUkRTKCAKICAgICAgICBmaWxlID0gIi4vZmFjdG9yX25hbWVzL2ZhY3Rvcl9uYW1lc19lZmFfd2RtX2QxY19hZCIpCmZhY3Rvcl9uYW1lc19lZmFfd2RtX2QxZF9hZCA8LSByZWFkUkRTKCAKICAgICAgICBmaWxlID0gIi4vZmFjdG9yX25hbWVzL2ZhY3Rvcl9uYW1lc19lZmFfd2RtX2QxZF9hZCIpCgojIHN0dWR5IDIKZmFjdG9yX25hbWVzX2VmYV93ZG1fZDJfYWQgPC0gcmVhZFJEUyggCiAgICAgICAgZmlsZSA9ICIuL2ZhY3Rvcl9uYW1lcy9mYWN0b3JfbmFtZXNfZWZhX3dkbV9kMl9hZCIpCmZhY3Rvcl9uYW1lc19lZmFfcGFyX2QyX2FkIDwtIHJlYWRSRFMoIAogICAgICAgIGZpbGUgPSAiLi9mYWN0b3JfbmFtZXMvZmFjdG9yX25hbWVzX2VmYV9wYXJfZDJfYWQiKQpmYWN0b3JfbmFtZXNfZWZhX3dkbV9kMl83OSA8LSByZWFkUkRTKCAKICAgICAgICBmaWxlID0gIi4vZmFjdG9yX25hbWVzL2ZhY3Rvcl9uYW1lc19lZmFfd2RtX2QyXzc5IikKCiMgc3R1ZHkgMwpmYWN0b3JfbmFtZXNfZWZhX3dkbV9kM19hZCA8LSByZWFkUkRTKCAKICAgICAgICBmaWxlID0gIi4vZmFjdG9yX25hbWVzL2ZhY3Rvcl9uYW1lc19lZmFfd2RtX2QzX2FkIikKZmFjdG9yX25hbWVzX2VmYV93ZG1fZDNfNzkgPC0gcmVhZFJEUyggCiAgICAgICAgZmlsZSA9ICIuL2ZhY3Rvcl9uYW1lcy9mYWN0b3JfbmFtZXNfZWZhX3dkbV9kM183OSIpCmZhY3Rvcl9uYW1lc19lZmFfd2RtX2QzXzQ2IDwtIHJlYWRSRFMoIAogICAgICAgIGZpbGUgPSAiLi9mYWN0b3JfbmFtZXMvZmFjdG9yX25hbWVzX2VmYV93ZG1fZDNfNDYiKQpmYWN0b3JfbmFtZXNfZWZhX3Bhcl9kM180NiA8LSByZWFkUkRTKCAKICAgICAgICBmaWxlID0gIi4vZmFjdG9yX25hbWVzL2ZhY3Rvcl9uYW1lc19lZmFfcGFyX2QzXzQ2IikKCiMgc3R1ZHkgNApmYWN0b3JfbmFtZXNfZWZhX3dkbV9kNF9hZCA8LSByZWFkUkRTKCAKICAgICAgICBmaWxlID0gIi4vZmFjdG9yX25hbWVzL2ZhY3Rvcl9uYW1lc19lZmFfd2RtX2Q0X2FkIikKZmFjdG9yX25hbWVzX2VmYV9wYXJfZDRfNDYgPC0gcmVhZFJEUyggCiAgICAgICAgZmlsZSA9ICIuL2ZhY3Rvcl9uYW1lcy9mYWN0b3JfbmFtZXNfZWZhX3Bhcl9kNF80NiIpCmZhY3Rvcl9uYW1lc19lZmFfd2RtX2Q0XzQ2IDwtIHJlYWRSRFMoIAogICAgICAgIGZpbGUgPSAiLi9mYWN0b3JfbmFtZXMvZmFjdG9yX25hbWVzX2VmYV93ZG1fZDRfNDYiKQpgYGAKCgpgYGB7cn0KIyBjb2xvcnMgZm9yIHBsb3R0aW5nIHRhcmdldCBjaGFyYWN0ZXJzCmNvbG9yczAyIDwtIGMoIiNlNDFhMWMiLCAiIzM3N2ViOCIpCmNvbG9yczA5IDwtIGNvbG9yUmFtcFBhbGV0dGUoYygiI2UzMWExYyIsICIjZmY3ZjAwIiwgIiMzM2EwMmMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjMWY3OGI0IiwgIiM2YTNkOWEiKSwgIyBmcm9tIGNvbG9yYnJld2VyMi5vcmcgIlBhaXJlZCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZSA9ICJMYWIiKSg5KQpjb2xvcnMyMSA8LSBjb2xvclJhbXBQYWxldHRlKGMoIiNlMzFhMWMiLCAiI2ZmN2YwMCIsICIjMzNhMDJjIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIzFmNzhiNCIsICIjNmEzZDlhIiksICMgZnJvbSBjb2xvcmJyZXdlcjIub3JnICJQYWlyZWQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2UgPSAiTGFiIikoMjEpCmBgYAoKIyBDaGFwdGVyIG92ZXJ2aWV3CgpJbiB0aGlzIGNoYXB0ZXIsIEkgZm9jdXMgb24gdGhlIHNlY29uZCBvZiBteSB0aHJlZSBrZXkgcXVlc3Rpb25zIGFib3V0IHRoZSBkZXZlbG9wbWVudCBvZiByZXByZXNlbnRhdGlvbnMgb2YgbWVudGFsIGxpZmU6IF9Ib3cgYXJlIHRoZSBjb25jZXB0dWFsIHVuaXRzIHRoYXQgYW5jaG9yIHJlcHJlc2VudGF0aW9ucyBvZiBtZW50YWwgbGlmZSBvcmdhbml6ZWQgaW4gcmVsYXRpb24gdG8gZWFjaCBvdGhlciwgYW5kIGhvdyBkb2VzIHRoaXMgb3JnYW5pemF0aW9uIGNoYW5nZSBvdmVyIGRldmVsb3BtZW50P18gQXMgaW4gQ2hhcHRlciBJSUksIHRvIGFkZHJlc3MgdGhpcyBxdWVzdGlvbiBJIGRyYXcgb24gZGF0YSBmcm9tIGFsbCBvZiB0aGUgY3VycmVudCBzdHVkaWVzIChTdHVkaWVzIDEtNCk7IGZvciBkZXRhaWxzIGFib3V0IHRoZSBtZXRob2RzIG9mIHRoZXNlIHN0dWRpZXMsIHNlZSBDaGFwdGVyIElJLiBUaGUgZ29hbCBvZiB0aGlzIGNoYXB0ZXIgaXMgdG8gcHJvdmlkZSAic25hcHNob3RzIiBvZiB0aGUgb3JnYW5pemF0aW9uIG9mIGNvbmNlcHR1YWwgdW5pdHMgaW4gZWFybHkgY2hpbGRob29kLCBtaWRkbGUgY2hpbGRob29kLCBhbmQgYWR1bHRob29kLgoKCiMgR2VuZXJhbCBhbmFseXNpcyBwbGFuCgojIyBIaWdoLWxldmVsIG92ZXJ2aWV3CgpNeSBnb2FsIGluIHRoaXMgY2hhcHRlciBpcyB0byBleGFtaW5lIHRoZSByZWxhdGlvbnNoaXBzIGFtb25nIHRoZSAiY29uY2VwdHVhbCB1bml0cyIgaWRlbnRpZmllZCBpbiBDaGFwdGVyIElJSS4gSG93IGRvZXMgYSBwYXJ0aWNpcGFudCdzIGFzc2Vzc21lbnQgb2Ygb25lIGNvbmNlcHR1YWwgdW5pdCBmb3IgYSBwYXJ0aWN1bGFyIHRhcmdldCBjaGFyYWN0ZXIgKGUuZy4sIHRoZSBkZWdyZWUgdG8gd2hpY2ggaGUgb3Igc2hlIGluZGljYXRlcyB0aGF0IGEgYmVldGxlIGlzIGNhcGFibGUgb2YgdGhlIHBoeXNpb2xvZ2ljYWwgc2Vuc2F0aW9ucyBvZiB0aGUgQk9EWSkgYWZmZWN0IHRoYXQgcGFydGljaXBhbnQncyBhc3Nlc3NtZW50cyBvZiBvdGhlciBjb25jZXB0dWFsIHVuaXRzIGZvciB0aGF0IHRhcmdldCBjaGFyYWN0ZXIgKGUuZy4sIGhpcyBvciBoZXIgYXNzZXNzbWVudCBvZiB0aGUgYmVldGxlJ3MgY2FwYWNpdGVpcyBpbiB0aGUgZG9tYWlucyBvZiBIRUFSVCBvciBNSU5EKT8KCkkgZm9jdXMgaW4gcGFydGljdWxhciBvbiB0aGUgcG9zc2liaWxpdHkgdGhhdCB0aGUgbWVudGFsIGNhcGFjaXR5IGF0dHJpYnV0aW9ucyBkb2N1bWVudGVkIGJ5IHRoZSBzdHVkaWVzIGluY2x1ZGVkIGluIHRoaXMgZGlzc2VydGF0aW9u4oCUcmUtYW5hbHl6ZWQgYXMgaW5kaWNhdG9ycyBvZiB0aGUgYnJvYWRlciAiY29uY2VwdHVhbCB1bml0cyIgaWRlbnRpZmllZCBpbiBDaGFwdGVyIElJSeKAlG1pZ2h0IHNoZWQgbGlnaHQgb24gdGhlIF9oaWVyYXJjaGljYWwgb3JnYW5pemF0aW9uXyBvZiB0aGVzZSBjb25jZXB0dWFsIHVuaXRzLCBpLmUuLCB3aGljaCBjb25jZXB0dWFsIHVuaXRzIG1pZ2h0IGJlIG1vcmUgYmFzaWMgb3IgZnVuZGFtZW50YWwgdnMuIG1vcmUgY29tcGxleCwgYW5kIHdoZXRoZXIgYW55IG9mIHRoZXNlIGNvbmNlcHR1YWwgdW5pdHMgbWlnaHQgb3IgbWlnaHQgbm90IGJlIGNvbnNpZGVyZWQgdG8gZGVwZW5kIG9uIHRoZSBwcmVzZW5jZSBvZiBvdGhlcnMuIEluIENoYXB0ZXIgSUksIEkgaWxsdXN0cmF0ZWQgdGhpcyB3aXRoIHRoZSBmb2xsb3dpbmcgZXhhbXBsZTogSWYgbWFueSBwYXJ0aWNpcGFudHMgZW5kb3JzZSBjYXBhY2l0aWVzIGFzc29jaWF0ZWQgd2l0aCBDb25jZXB0dWFsIFVuaXQgQSB3aXRob3V0IGVuZG9yc2luZyBjYXBhY2l0aWVzIGFzc29jaWF0ZWQgd2l0aCBDb25jZXB0dWFsIFVuaXQgQiwgYnV0IHZlcnkgZmV3IHBhcnRpY2lwYW50cyBkbyB0aGUgcmV2ZXJzZSAoZW5kb3JzaW5nIGNhcGFjaXRpZXMgYXNzb2NpYXRlZCB3aXRoIENvbmNlcHR1YWwgVW5pdCBCIGJ1dCBub3QgQ29uY2VwdHVhbCBVbml0IEEpLCB0aGlzIHByb3ZpZGVzIHNvbWUgZXZpZGVuY2UgdGhhdCBDb25jZXB0dWFsIFVuaXQgQSBpcyBtb3JlIGJhc2ljIG9yIGZ1bmRhbWVudGFsIHRoYW4gQ29uY2VwdHVhbCBVbml0IEIsIG9yIHRoYXQgQ29uY2VwdHVhbCBVbml0IEIgc29tZWhvdyBkZXBlbmRzIG9uIChwZXJoYXBzIHJlcXVpcmVzKSBDb25jZXB0dWFsIFVuaXQgQS4gCgpIZXJlIEkgd2lsbCB0cmFuc2xhdGUgdGhpcyBnZW5lcmFsIGludGVyZXN0IGluIHRoZSByZWxhdGlvbnNoaXBzIGFtb25nIGNvbmNlcHR1YWwgdW5pdHMsIGFzIHdlbGwgYXMgdGhlIHNwZWNpZmljIGludHVpdGlvbiBhYm91dCBob3cgdG8gZGV0ZWN0IHRoZSBraW5kcyBvZiBhc3ltbWV0cmllcyB0aGF0IHdvdWxkIGJlIHRoZSBzaWduYXR1cmUgb2YgaGllcmFyY2hpY2FsIHJlbGF0aW9uc2hpcHMsIGludG8gYSBzcGVjaWZpYyBhbmFseXNpcyBwbGFuIHRvIGJlIGFwcGxpZWQgdG8gZWFjaCBvZiB0aGVzZSBkYXRhc2V0cyBpbiB0dXJuLiAKCiMjIERldGFpbHMgb2YgYW5hbHlzZXMKClVubGlrZSB0aGUgcHJldmlvdXMgY2hhcHRlciwgaW4gd2hpY2ggSSBlbXBsb3llZCBhIGNhbm9uaWNhbCBhcHByb2FjaCB0byBpZGVudGlmeWluZyBsYXRlbnQgY29uc3RydWN0cyB0aHJvdWdoIGFuYWx5c2VzIG9mIGNvcnJlbGF0aW9uIHN0cnVjdHVyZXPigJRleHBsb3JhdG9yeSBmYWN0b3IgYW5hbHlzaXMgKEVGQSnigJRpbiB0aGlzIGNoYXB0ZXIgdGhlcmUgaXMgbm8gdHJpZWQtYW5kLXRydWUgbWV0aG9kIGZvciBtZWV0aW5nIG15IGFuYWx5c2lzIGdvYWxzLiBJbnN0ZWFkLCBJIGNoYXJ0IG15IG93biBjb3Vyc2UgdGhyb3VnaCB0aGVzZSBkYXRhc2V0cywgdXNpbmcgdGhlIEVGQSBzb2x1dGlvbnMgcmVwb3J0ZWQgaW4gQ2hhcHRlciBJSSB0byBzY29yZSBwYXJ0aWNpcGFudHMnIGVuZG9yc2VtZW50cyBvZiBlYWNoIGNvbmNlcHR1YWwgdW5pdCBmb3IgdGhlIHBhcnRpY3VsYXIgdGFyZ2V0IGNoYXJhY3RlcihzKSB0aGF0IHRoZXkgYXNzZXNzZWQsIGV4YW1pbmluZyB2aXN1YWxpemF0aW9ucyBvZiB0aGUgY29tcGxpY2F0ZWQgcmVsYXRpb25zaGlwcyBhbW9uZyB0aGVzZSBlbmRvcnNlbWVudHMsIGFuZCB0aGVuIGNvbmR1Y3RpbmcgbW9yZSB0YXJnZXRlZCBzdGF0aXN0aWNhbCBhbmFseXNlcyBvZiBvbmUgcGFydGljdWxhciBhc3BlY3Qgb2YgdGhlc2UgcmVsYXRpb25zaGlwczogdGhlIHBvc3NpYmlsaXR5IG9mIGFzeW1tZXRyaWVzIGluIHRoZSBlbmRvcnNlbWVudHMgb2YgdGhlc2UgY29uY2VwdHVhbCB1bml0cy4KCiMjIyBTY29yaW5nIGVuZG9yc2VtZW50cyBvZiBjb25jZXB0dWFsIHVuaXRzCgpUaGUgZmlyc3Qgc3RlcCBpbiB0aGVzZSBhbmFseXNlcyBpcyB0byB0cmFuc2Zvcm0gcGFydGljaXBhbnRzJyByYXRpbmdzIG9mIGluZGl2aWR1YWwgbWVudGFsIGNhcGFjaXRpZXMgaW50byAic2NvcmVzIiB0aGF0IGluZGljYXRlIHRoZSBleHRlbnQgdG8gd2hpY2ggdGhleSBlbmRvcnNlZCBhIHBhcnRpY3VsYXIgY29uY2VwdHVhbCB1bml0IGZvciB0aGUgdGFyZ2V0IGNoYXJhY3RlcihzKSB0aGF0IHRoZXkgd2VyZSBhc3NpZ25lZCB0byBhc3Nlc3MuIFRvIGRvIHRoaXMsIEkgbWFrZSB1c2Ugb2YgdGhlIEVGQXMgcHJlc2VudGVkIGluIENoYXB0ZXIgSUnigJR3aGljaCBvcmlnaW5hbGx5IHNlcnZlZCB0byBpZGVudGlmeSBhIHNldCBvZiBjb25jZXB0dWFsIHVuaXRzIGluIGEgcGFydGljdWxhciBzYW1wbGXigJR0byBhIG5ldyBlbmQ6IHRoZSBjb25zdHJ1Y3Rpb24gb2YgInNjYWxlcyIgZm9yIGVhY2ggb2YgdGhlc2UgY29uY2VwdHVhbCB1bml0cy4gU2NhbGUgY29uc3RydWN0aW9uIGlzIGEgY29tbW9uIHVzZSBvZiBFRkEgYW5kIHNpbWlsYXIgZGltZW5zaW9uYWxpdHkgcmVkdWN0aW9uIGFuYWx5c2VzIChpZiBhbnl0aGluZywgbW9yZSBjb21tb24gdGhhbiB1c2luZyBFRkEgdG8gbWFrZSB0aGUga2luZHMgb2YgdGhlb3JldGljYWwgYXJndW1lbnRzIGZlYXR1cmVkIGluIENoYXB0ZXIgSUkpLgoKRm9yIGVhY2ggRUZBIHNvbHV0aW9uLCBJIGNvbnN0cnVjdCBhIHNjYWxlIGZvciBlYWNoIG9mIHRoZSBmYWN0b3JzIChjb25jZXB0dWFsIHVuaXRzKSBpZGVudGlmaWVkIGJ5IHRoYXQgc29sdXRpb24uIEZpcnN0LCBJIHNvcnQgZWFjaCBvZiB0aGUgbWVudGFsIGNhcGFjaXRpZXMgaW5jbHVkZWQgaW4gdGhhdCBzdHVkeSBpbnRvIGNhdGVnb3JpZXMgYmFzZWQgb24gdGhlaXIgbG9hZGluZ3Mgb24gZWFjaCBvZiB0aGUgZmFjdG9ycyBpbiB0aGF0IHNvbHV0aW9uLiBGb3IgZWFjaCBtZW50YWwgY2FwYWNpdHksIEkgaWRlbnRpZnkgdGhlICJkb21pbmFudCIgZmFjdG9yIGFzIHRoZSBmYWN0b3Igd2l0aCB0aGUgbGFyZ2VzdCBwb3NpdGl2ZSBmYWN0b3IgbG9hZGluZy4gRm9yIGV4YW1wbGUsIGlmIHRoZSBtZW50YWwgY2FwYWNpdHkgX2ZlZWwgaGFwcHlfIGhhZCBsb2FkaW5ncyBvZiAwLjYwIG9uIHRoZSBCT0RZIGZhY3RvciwgMC43MCBvbiB0aGUgSEVBUlQgZmFjdG9yLCBhbmQgMC4zMCBvbiB0aGUgTUlORCBmYWN0b3IsIEkgd291bGQgc29ydCBpdCBpbnRvIHRoZSBIRUFSVCBjYXRlZ29yeS4gRm9yIGVhY2ggZmFjdG9yLCBJIHRha2UgdGhlIHNpeCBoaWdoZXN0LWxvYWRpbmcgaXRlbXMgYXMgYSBjYW5kaWRhdGUgc2NhbGUsIHRoZW4gImRyb3AiIHRoZSBjYXBhY2l0aWVzIHdpdGggdGhlIHNtYWxsZXN0IGZhY3RvciBsb2FkaW5ncyBvbiB0aGVpciByZXNwZWN0aXZlIGRvbWluYW50IGZhY3RvcnMgdW50aWwgSSBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBtZW50YWwgY2FwYWNpdGllcyBpbiBlYWNoIGNhdGVnb3J5LiBGb3IgZXhhbXBsZSwgaWYgdGhlIEJPRFkgZmFjdG9yIHdlcmUgdGhlIGRvbWluYW50IGZhY3RvciBmb3IgbmluZSBtZW50YWwgY2FwYWNpdGllcywgdGhlIEhFQVJUIGZhY3RvciBmb3Igc2l4IG1lbnRhbCBjYXBhY2l0aWVzLCBhbmQgdGhlIE1JTkQgZmFjdG9yIGZvciBmaXZlIGNhcGFjaXRpZXMsIGZvciBlYWNoIGZhY3RvciBJIHdvdWxkIGtlZXAgb25seSB0aGUgY2FwYWNpdGllcyB3aXRoIHRoZSBmaXZlIGhpZ2hlc3QgcG9zaXRpdmUgbG9hZGluZ3Mgb24gdGhhdCBmYWN0b3IsIGluIG9yZGVyIHRvIGNvbnN0cnVjdCB0aHJlZSBzY2FsZXMgb2YgZXF1YWwgbGVuZ3RoIChhbmQgYSBtYXhpbXVtIGxlbmd0aCBvZiBzaXggaXRlbXMpLgoKVG8gY2FsY3VsYXRlIHNjb3JlcyBvbiB0aGVzZSBzY2FsZXMsIEkgdGFrZSB0aGUgYXZlcmFnZSBvZiBhbGwgb2YgbWVudGFsIGNhcGFjaXRpZXMgZm9yIGVhY2ggc2NhbGUuIFRoaXMgeWllbGRzIGEgZGF0YXNldCBpbiB3aGljaCBlYWNoIHBhcnRpY2lwYW50IGlzIGFzc29jaWF0ZWQgd2l0aCBvbmUgc2NvcmUgZm9yIGVhY2ggb2YgdGhlIGNvbmNlcHR1YWwgdW5pdHMgaWRlbnRpZmllZCBpbiB0aGUgcmVsYXRpdmUgRUZBIHNvbHV0aW9uLCBmb3IgZWFjaCBvZiB0aGUgdGFyZ2V0IGNoYXJhY3RlcnMgdGhhdCB0aGF0IHBhcnRpY2lwYW50IGFzc2Vzc2VkLgoKSW4gdGhpcyBjaGFwdGVyLCBJIGFwcGx5IHRoaXMgbWV0aG9kIHRvIGFsbCBvZiB0aGUgdGhyZWUtZmFjdG9yIHNvbHV0aW9ucyBmb3IgYWR1bHQgc2FtcGxlcyBhcyBwcmVzZW50ZWQgaW4gQ2hhcHRlciBJSSAoU3R1ZGllcyAxLTQpLCB5aWVsZGluZyBCT0RZLCBIRUFSVCwgYW5kIE1JTkQgc2NvcmVzIGZvciBlYWNoIHRhcmdldCBjaGFyYWN0ZXIgYXMgYXNzZXNzZWQgYnkgZWFjaCBwYXJ0aWNpcGFudC4gKEkgaWdub3JlIHRoZSBhYmVycmFudCBmb3VyLWZhY3RvciBzb2x1dGlvbiBmb3IgYWR1bHRzIGluIFN0dWR5IDIgc3VnZ2VzdGVkIGJ5IG9uZSBvZiB0aGUgdGhyZWUgZmFjdG9yIHJldGVudGlvbiBwcm90b2NvbHMgY29uc2lkZXJlZCBpbiB0aGF0IGNoYXB0ZXIsIHNpbmNlIHRoaXMgd2FzIHRoZSBvbmx5IHN0dWR5IG91dCBvZiB0aGUgc2V2ZW4gY29uc2lkZXJlZCBpbiB3aGljaCBhIGZvdXItZmFjdG9yIHNvbHV0aW9uIGFwcGVhcmVkIHRvIGFkZCBhbnkgdmFsdWUgYmV5b25kIHRoZSByb2J1c3QgQk9EWS1IRUFSVC1NSU5EIGZyYW1ld29yayBjb21tb24gdG8gYWxsIHN0dWRpZXMuIFtYWCBBUFBFTkRJWCBCP10pCgpGb3IgY2hpbGQgc2FtcGxlcywgSSBhcHBseSB0aGlzIG1ldGhvZCBib3RoIHRvIHRoZSBzb2x1dGlvbnMgZW1lcmdpbmcgZnJvbSBjaGlsZHJlbidzIG93biBkYXRhIGFuZCB0byB0aGUgY29ycmVzcG9uZGluZyBfYWR1bHRfIHNvbHV0aW9ucyBmb3IgdGhlIHN0dWRpZXMgaW4gcXVlc3Rpb24uIFRoaXMgYWxsb3dzIG1lIHRvIGV4cGxvcmUgYm90aCB0aGUgcmVsYXRpb25zaGlwcyBhbW9uZyBjaGlsZHJlbidzIG93biBjb25jZXB0dWFsIHVuaXRzLCBhbmQgdGhlIHJlbGF0aW9uc2hpcHMgYW1vbmcgYSBmdWxseSBhZHVsdC1saWtlIHNldCBvZiBjb25jZXB0dWFsIHVuaXRzIChwcmVzdW1hYmx5LCB0aGUgY29uY2VwdHVhbCB1bml0cyB0aGF0IHRoZXNlIGNoaWxkcmVuIHdpbGwgZXZlbnR1YWxseSBjb21lIHRvIGFncmVlIG9uIGFzIHRoZXkgbWF0dXJlIGludG8gYWR1bHRzKS4gCgpGb3IgIm9sZGVyIiBjaGlsZHJlbiAoNy05eSBvZiBhZ2U7IFN0dWRpZXMgMiBhbmQgMyksIHRoaXMgbWVhbnMgZXhhbWluaW5nIHR3byBzZXRzIG9mIHRocmVlIGNvbmNlcHR1YWwgdW5pdHMgZm9yIGVhY2ggc2FtcGxlIG9mIGNoaWxkcmVuOiAoMSkgQk9EWSwgSEVBUlQsIGFuZCBNSU5EIGFzIGRlZmluZWQgYnkgYWR1bHRzIGluIHRoYXQgc3R1ZHk7IGFuZCAoMikgQk9EWSwgSEVBUlQsIGFuZCBNSU5EIGFzIGRlZmluZWQgYnkgdGhlIGNoaWxkcmVuIHRoZW1zZWx2ZXMuIEJlY2F1c2UgdGhlIEVGQXMgZm9yIG9sZGVyIGNoaWxkcmVuIGFuZCBhZHVsdHMgYXJlIHNvIHNpbWlsYXIgKHNlZSBDaGFwdGVyIElJKSwgSSBleHBlY3QgdGhlIG91dGNvbWVzIG9mIHRoZXNlIHR3byBhcHByb2FjaGVzIHRvIGNvbnN0cnVjdGluZyBCT0RZLCBIRUFSVCwgYW5kIE1JTkQgc2NhbGVzIHRvIHlpZWxkIHZlcnkgc2ltaWxhciByZXN1bHRzIGluIHRoaXMgYWdlIGdyb3VwLgoKRm9yICJ5b3VuZ2VyIiBjaGlsZHJlbiwgdGhpcyBtZWFucyBleGFtaW5pbmcgbXVsdGlwbGUgc2V0cyBvZiBjb25jZXB0dWFsIHVuaXRzIGZvciBlYWNoIHNhbXBsZSBvZiBjaGlsZHJlbiwgaW5jbHVkaW5nICgxKSBCT0RZLCBIRUFSVCwgYW5kIE1JTkQgYXMgZGVmaW5lZCBieSBhZHVsdHMgaW4gdGhhdCBzdHVkeTsgYW5kICgyKSB2YXJ5aW5nIHNldHMgb2YgMi00IGNvbmNlcHR1YWwgdW5pdHMgYXMgZGVmaW5lZCBieSBFRkEgb2YgY2hpbGRyZW4ncyBvd24gcmVzcG9uc2VzLCB1c2luZyBkaWZmZXJlbnQgZmFjdG9yIHJldGVudGlvbiBwcm90b2NvbHMuIFRoZSBFRkFzIG9mIHlvdW5nZXIgY2hpbGRyZW4ncyByZXNwb25zZXMgIHdlcmUgbGVzcyByZWxpYWJsZSwgYW5kIGxlc3MgYWR1bHQtbGlrZSwgdGhhbiB0aG9zZSBvZiBvbGRlciBjaGlsZHJlbi4gQXMgYSBjb25zZXF1ZW5jZSwgSSBleHBlY3QgdGhlIG91dGNvbWVzIG9mIHRoZXNlIGRpZmZlcmVudCBhcHByb2FjaGVzIHRvIGNvbnN0cnVjdGluZyBzY2FsZXMgZm9yIGVhY2ggY29uY2VwdHVhbCB1bml0IHRvIHlpZWxkIHJhdGhlciBkaWZmZXJlbnQgcmVzdWx0cyBpbiB0aGlzIGFnZSBncm91cC4KClRoZSByZWFkZXIgc2hvdWxkIG5vdGUgdGhhdCB0aGlzIGlzIGZhciBmcm9tIHRoZSBvbmx5IHdheSB0byBhcHByb2FjaCAic2NvcmluZyIgcGFydGljaXBhbnRzIG9uIHRoZXNlIGNvbmNlcHR1YWwgdW5pdHMuIEluIHBhcnRpY3VsYXIsIEkgY291bGQgaGF2ZSBleGFtaW5lZCBmYWN0b3Igc2NvcmVz4oCUc3VtbWFyaWVzIG9mIGVhY2ggZmFjdG9yIChjb25jZXB0dWFsIHVuaXQpIGJhc2VkIG9uIGEgcGFydGljaXBhbnQncyByZXNwb25zZXMgdG8gYWxsIG1lbnRhbCBjYXBhY2l0aWVzIGFuZCB0aGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIGFsbCBtZW50YWwgY2FwYWNpdGllcyBhbmQgYWxsIGZhY3RvcnMgaW5jbHVkZWQgaW4gdGhhdCBFRkEgc29sdXRpb27igJRyYXRoZXIgdGhhbiBjb25zdHJ1Y3RpbmcgInNjYWxlcyIgaW4gdGhlIHdheSBJIGhhdmUganVzdCBvdXRsaW5lZC4gSG93ZXZlciwgbXVjaCBsaWtlIF96Xy1zY29yZXMsIGZhY3RvciBzY29yZXMgaW5kaWNhdGUgd2hlcmUgYSBwYXJ0aWNpcGFudCBmYWxscyBpbiByZWxhdGlvbiB0byBvdGhlciBwYXJ0aWNpcGFudHMgaW4gdGhlIHNhbXBsZSwgYW5kIGRvIG5vdCBwcm92aWRlIHRoZSBraW5kIG9mIGFic29sdXRlIHNjb3JlIHRoYXQgaXMga2V5IHRvIG15IGdvYWwgaW4gdGhpcyBjaGFwdGVyLCB3aGljaCBpcyB0byBhbmFseXplIHJlbGF0aW9uc2hpcHMgYW1vbmcgZmFjdG9ycyBpbiB0ZXJtcyBvZiB0aGUgZXh0ZW50IHRvIHdoaWNoIGluZGl2aWR1YWwgcGFydGljaXBhbnRzIGluZGljYXRlZCB0aGF0IHRhcmdldCBjaGFyYWN0ZXJzICJwb3NzZXNzZWQiIHRoZSBjb25jZXB0dWFsIHVuaXRzIEJPRFksIEhFQVJULCBhbmQgTUlORC4gW1hYIEFQUEVORElYIEI/XQoKRXZlbiB3aXRoaW4gdGhlICJzY2FsZSIgYXBwcm9hY2ggZGVzY3JpYmVkIGluIHRoaXMgc2VjdGlvbiwgdGhlcmUgYXJlIG1hbnkgcGFyYW1ldGVycyBvZiB0aGlzIGFuYWx5c2lzIHRoYXQgSSBjb3VsZCBoYXZlIHNldCBkaWZmZXJlbnRseS4gRm9yIGV4YW1wbGUsIEkgY291bGQgaGF2ZSBjb25zaWRlcmVkIGFic29sdXRlIGZhY3RvciBsb2FkaW5ncyByYXRoZXIgdGhhbiByYXcgZmFjdG9yIGxvYWRpbmdzLCB3aGljaCB3b3VsZCBhbGxvdyBmb3IgbWVudGFsIGNhcGFjaXRpZXMgdGhhdCBsb2FkZWQgZXNwZWNpYWxseSBzdHJvbmdseSBfbmVnYXRpdmVseV8gb24gYSBwYXJ0aWN1bGFyIGZhY3RvciB0byBjb250cmlidXRlIChuZWdhdGl2ZWx5KSB0byBzY29yZXMgb24gdGhhdCBjb25jZXB0dWFsIHVuaXQ7IEkgY291bGQgaGF2ZSBvbWl0dGVkIHRoZSBzdGVwIG9mIG1ha2luZyB0aGUgc2NhbGVzIGZvciBhbGwgZmFjdG9ycyB3aXRoaW4gYSBzaW5nbGUgRUZBIHNvdGx1aW9uIGVxdWFsIGxlbmd0aDsgSSBjb3VsZCBoYXZlIGNob3NlbiB0byB1c2Ugb25seSB0aGUgdG9wIDQgb3IgNSBtZW50YWwgY2FwYWNpdGllcyBhY3Jvc3MgYWxsIEVGQSBzb2x1dGlvbnMsIG9yIHRvIHNldCBubyBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIGEgc2NhbGU7IG9yIEkgY291bGQgaGF2ZSBpbXBsZW1lbnRlZCBhYnNvbHV0ZSB0aHJlc2hvbGRzIGZvciBob3cgc3Ryb25nbHkgYSBtZW50YWwgY2FwYWNpdHkgbXVzdCBsb2FkIG9uIGEgZmFjdG9yIGluIG9yZGVyIHRvIGNvdW50IHRvd2FyZCB0aGUgc2NvcmUgZm9yIHRoYXQgY29uY2VwdHVhbCB1bml0LCBvciBhYnNvbHV0ZSBsaW1pdHMgb24gdGhlIGRlZ3JlZSB0byB3aGljaCBhIG1lbnRhbCBjYXBhY2l0eSBjYW4gImNyb3NzLWxvYWQiIG9uIG5vbi1kb21pbmFudCBmYWN0b3JzIGFuZCBzdGlsbCBjb3VudCB0b3dhcmQgdGhlIHNjb3JlIGZvciBhbnkgb25lIGNvbmNlcHR1YWwgdW5pdC4gW1hYIEFQUEVORElYIEI/XSBIb3dldmVyLCB0aGVzZSBraW5kcyBvZiBkZXRhaWxzIGRpZmZlciBxdWl0ZSBkcmFtYXRpY2FsbHkgYWNyb3NzIHN0dWRpZXMgYW5kIGFnZSBncm91cHMuIEZvciBleGFtcGxlLCBpbiBzb21lIHNhbXBsZXMgdGhlcmUgYXJlIG5vIHN0cm9uZyBuZWdhdGl2ZSBmYWN0b3IgbG9hZGluZ3MsIGFuZCBpbiBvdGhlcnMgdGhlcmUgYXJlOyBpZiBJIGNvbnNpZGVyZWQgYWJzb2x1dGUgbG9hZGluZ3MgcmF0aGVyIHRoYW4gcmF3IGxvYWRpbmdzLCBJIGNvdWxkIGVuZCB1cCBjb21wYXJpbmcgc2NvcmVzIGZyb20gYSAiYmlwb2xhciIgc2NhbGUgaW4gb25lIHNhbXBsZSB0byBzY29yZXMgZnJvbSBhICJ1bmlwb2xhciIgc2NhbGVzIGluIGFub3RoZXIgc2FtcGxlLCBtYWtpbmcgdGhlIGNvbXBhcmlzb24gbW9yZSBkaWZmaWN1bHQgdG8gaW50ZXJwcmV0LiBMaWtld2lzZSwgc29tZSBFRkEgc29sdXRpb25zIHRlbmRlZCB0byBmZWF0dXJlIGdlbmVyYWxseSB3ZWFrZXIgZmFjdG9yIGxvYWRpbmdzIHRoYW4gb3RoZXJzOyBpZiBJIHdlcmUgdG8gaW1wb3NlIGFic29sdXRlIHRocmVzaG9sZHMgZm9yIHRoZSBzdHJlbmd0aCBvZiBmYWN0b3IgbG9hZGluZ3MsIEkgY291bGQgZW5kIHVwIGNvbXBhcmluZyBzY29yZXMgZnJvbSBzY2FsZXMgb2Ygd2lsZGx5IGRpZmZlcmVudCBsZW5ndGhzIGFjcm9zcyBzYW1wbGVzLiBJbiBteSB2aWV3LCB0aGUgYW5hbHlzaXMgZGVjaXNpb25zIG91dGxpbmVkIGFib3ZlIG1heGltaXplIGNvbXBhcmFiaWxpdHkgYWNyb3NzIHN0dWRpZXMgYW5kIGFnZSBncm91cHPigJR0aGUgcHJpbWFyeSBnb2FsIG9mIHRoaXMgY2hhcHRlci4gKE5vdGUsIGhvd2V2ZXIsIHRoYXQgaW4gdGhlIGFuYWx5c2lzIGNvZGUgZm9yIHRoaXMgY2hhcHRlciBJIGhhdmUgaW5jbHVkZWQgZWFzeSBzaG9ydCBjdXRzIGZvciB0aGUgaW50ZXJlc3RlZCByZWFkZXIgdG8gZXhwbG9yZSBkaWZmZXJlbnQgb3B0aW9ucyBmb3IgZWFjaCBvZiB0aGVzZSBwYXJhbWV0ZXJzLikKCmBgYHtyfQojIHNlZSAiLi9zY3JpcHRzL29yZ19wYXJhbS5SIiBmb3IgcGFyYW1ldGVyIHNldHRpbmcKYGBgCgojIyMgVmlzdWFsaXppbmcgcmVsYXRpb25zaGlwcwoKWFgKCm91dGxpbmU6CgotIGZvciBhbnkgc2FtcGxlLCBJIGhhdmUgaWRlbnRpZmllZCByZWxldmFudCBjb25jZXB0dWFsIHVuaXRzIChjaGFwdGVyIElJKSBhbmQgc2NvcmVkIGVhY2ggcGFydGljaXBhbnQncyBlbmRvcnNlbWVudCBvZiBlYWNoIG9mIHRoZXNlIHVuaXRzIGZvciB0aGVpciBhc3NpZ25lZCB0YXJnZXQgY2hhcmFjdGVyKHMpIChwcmV2aW91cyBzZWN0aW9uKQotIG5vdywgSSB3YW50IHRvIGFzc2VzcyB0aGUgcmVsYXRpb25zaGlwcyBhbW9uZyB0aGVzZSBlbmRvcnNlbWVudHMgCi0gYnV0IEkgZG9uJ3QgcmVhbGx5IGtub3cgd2hhdCB0byBleHBlY3QsIGFuZCB0aGVzZSByZWxhdGlvbnNoaXBzIGNvdWxkIGJlIHZlcnkgY29tcGxleAotIHNvLCBzdGFydCB3aXRoIGhvbGlzdGljLCBleHBsb3JhdG9yeSB2aXN1YWxpemF0aW9uOiBzY2F0dGVycGxvdHMgb2YgcGFpcnMgb2YgY29uY2VwdHVhbCB1bml0cwoKCiMjIyBUYXJnZXRpbmcgdGhlIHBvc3NpYmlsaXR5IG9mIGFzeW1tZXRyaWVzCgpYWAoKb3V0bGluZToKCi0gbm93LCBhIG1vcmUgdGFyZ2V0ZWQgYXBwcm9hY2ggdG8gb25lIHBhcnRpY3VsYXIgYXNwZWN0IG9mIHRoZXNlIHJlbGF0aW9uc2hpcHM6IGFzeW1tZXRyaWVzCi0gcmVtaW5kZXIgb2YgYmFzaWMgaW50dWl0aW9uOiBpbiB0aGlzIHNhbXBsZSwgZG8gcGFydGljaXBhbnRzIHRlbmQgdG8gZW5kb3JzZSBBIHdpdGhvdXQgQj8gQiB3aXRob3V0IEE/IGlzIHRoZXJlIGFuIGFzeW1tZXRyeSBoZXJlPwotIGNvbm5lY3QgdG8gdGhlIHZpc3VhbGl6YXRpb25zOiBhc3ltbWV0cmllcyBvZiBwb2ludHMgYXJvdW5kIHRoZSB5PXggbGluZSBvZiBlcXVpdmFsZW5jZQotIG9uZSB3YXkgdG8gYm9pbCB0aGlzIGRvd24gdG8gYSBudW1iZXI6IGRpZmZlcmVuY2Ugc2NvcmVzIChmb3IgZWFjaCBwYWlyKSwgY29tcGFyaXNvbnMgdG8gMCB2aWEgYmF5ZXNpYW4gcmVncmVzc2lvbnMKICAgIC0gZm9yIGFueSBwYWlyOiBpZiAwLCBubyBldmlkZW5jZSBmb3IgaGllcmFyY2h5LiBpZiBub24temVybywgc29tZSBldmlkZW5jZS4KICAgIC0gY29tcGFyaXNvbnMgYWNyb3NzIHBhaXJzOiBmdXJ0aGVyIGZyb20gMCwgbW9yZSBoaWVyYXJjaGljYWwuCiAgICAtIGNhdmVhdCAxOiB0aGVzZSBhcmUgcG9zdC1ob2MgYW5hbHlzZXMhIGJ1dCBzdGlsbCB1c2luZyBjb25maXJtYXRvcnkgc3RhdHMuIAogICAgLSBjYXZlYXQgMjogc2NvcmVzIG9mICgwLDApIHRyZWF0ZWQgc2FtZSBhcyBzY29yZXMgb2YgKDYsNiksIG9yIGFueXdoZXJlIGluIGJldHdlZW4uCgoKIyBTdHVkeSAxOiBBbiBhZHVsdCBlbmRwb2ludAoKSW4gdGhlIGNvbnRleHQgb2YgdGhpcyBkaXNzZXJ0YXRpb24sIFN0dWR5IDEgc2VydmVzIHRoZSByb2xlIG9mIGRlc2NyaWJpbmcgYSBkZXZlbG9wbWVudGFsIGVuZHBvaW50IGZvciBjb25jZXB0dWFsIHJlcHJlc2VudGF0aW9ucyBvZiBtZW50YWwgbGlmZS4gSW4gdGhpcyBjaGFwdGVyLCBJIGZvY3VzIG9uIHdoYXQgdGhlc2Ugc3R1ZGllcyBjYW4gcmV2ZWFsIGFib3V0IHRoZSByZWxhdGlvbnNoaXBzIGFtb25nIHRoZSBjb25jZXB0dWFsIHVuaXRzIGRpc2N1c3NlZCBpbiBDaGFwdGVyIElJSS4gVGhlc2UgYW5hbHlzZXMgd2VyZSBub3QgcGFydCBvZiB0aGUgb3JpZ2luYWwgcHVibGljYXRpb24gb2YgdGhlc2Ugc3R1ZGllcyAoV2Vpc21hbiBldCBhbC4sIDIwMTcpLgoKIyMgU3BlY2lhbCBub3RlcyBvbiBkYXRhIHByb2Nlc3NpbmcgYW5kIGFuYWx5c2lzCgpBcyBub3RlZCBpbiBDaGFwdGVyIElJLCBpbiB0aGUgb3JpZ2luYWwgYW5hbHlzaXMgb2YgdGhlc2UgZGF0YXNldHMgcmVzcG9uc2VzIHdlcmUgcmVjb2RlZCB0byBydW4gZnJvbSAtMyB0byArMyBiZWZvcmUgYW5hbHlzZXMgKFdlaXNtYW4gZXQgYWwuLCAyMDE3KTsgaW4gdGhpcyBkaXNzZXJ0YXRpb24sIEkgbWFpbnRhaW4gdGhlIDAtNiBjb2RpbmcgZm9yIGNvbXBhcmFiaWxpdHkgdG8gU3R1ZGllcyAyLTQuCgojIyBSZXN1bHRzCgojIyMgU3R1ZHkgMWEKCkluIFN0dWR5IDFhLCBgciBucm93KGQxYV9hZF93aWRlKWAgVVMgYWR1bHRzIGVhY2ggYXNzZXNzZWQgYSBzaW5nbGUgdGFyZ2V0IGNoYXJhY3RlciBvbiA0MCBtZW50YWwgY2FwYWNpdGllcy4gVGhpcyBzdHVkeSBlbXBsb3llZCB0aGUgImVkZ2UgY2FzZSIgdmFyaWFudCBvZiB0aGUgZ2VuZXJhbCBhcHByb2FjaCwgd2l0aCBwYXJ0aWNpcGFudHMgcmFuZG9tbHkgYXNzaWduZWQgdG8gYXNzZXNzIGVpdGhlciBhIGJlZXRsZSBvciBhIHJvYm90LiAoU2VlIENoYXB0ZXIgSUkgYW5kIFdlaXNtYW4gZXQgYWwuLCAyMDE3LCBmb3IgZGV0YWlsZWQgbWV0aG9kcy4pCgojIyMjIFNjYWxlIGNvbnN0cnVjdGlvbgoKYGBge3J9CnNjYWxlc19lZmFfd2RtX2QxYV9hZCA8LSBzY2FsZV9mdW4oZWZhX3dkbV9kMWFfYWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGZhY3Rvcl9uYW1lc19lZmFfd2RtX2QxYV9hZCkKYGBgCgpGb2xsb3dpbmcgdGhlIHN0ZXBzIGRlc2NyaWJlZCBpbiAiR2VuZXJhbCBhbmFseXNpcyBwbGFuLCIgYWJvdmUsIHlpZWxkZWQgYHIgZmFjdF9uYW1lX2Z1bihmYWN0b3JfbmFtZXNfZWZhX3dkbV9kMWFfYWQpYCBzY2FsZXMgb2YgYHIgc2NhbGVzX2VmYV93ZG1fZDFhX2FkICU+JSBjb3VudChmYWN0b3IpICU+JSBzdW1tYXJpc2UobWVhbiA9IG1lYW4obikpICU+JSBzZWxlY3QobWVhbikgJT4lIGFzLm51bWVyaWMoKWAgaXRlbXMgZWFjaDsgc2VlIFRhYmxlIDQuMS4KCmBgYHtyfQpkMWFfYWRfc2NvcmVkX2FkIDwtIHNjb3JlX2Z1bihkMWFfYWQsIHNjYWxlc19lZmFfd2RtX2QxYV9hZCkKYGBgCgojIyMjIFZpc3VhbGl6YXRpb24KClhYCgpgYGB7cn0KcGxvdHNfZDFhX2FkX3Njb3JlZF9hZCA8LSByZWx2aXpfZnVuKGQxYV9hZF9zY29yZWRfYWQpCmBgYAoKYGBge3J9CmZpZ3VyZTQuMWFfcGxvdHMgPC0gcGxvdF9ncmlkKHBsb3RzX2QxYV9hZF9zY29yZWRfYWRbWzFdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kMWFfYWRfc2NvcmVkX2FkW1syXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfZDFhX2FkX3Njb3JlZF9hZFtbM11dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkExIiwgIkEyIiwgIkEzIiksIG5jb2wgPSAzKQoKZmlndXJlNC4xYV9sZWcgPC0gZ2V0X2xlZ2VuZChwbG90c19kMWFfYWRfc2NvcmVkX2FkW1sxXV0gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVfZmlsbF9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGNvbG9yczAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMikpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX2NvbG9yX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gY29sb3JzMDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyKSkpCiAgCmZpZ3VyZTQuMWFfcGxvdHNfbGVnIDwtIHBsb3RfZ3JpZChmaWd1cmU0LjFhX3Bsb3RzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlndXJlNC4xYV9sZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDAuMDUpKQoKZmlndXJlNC4xYV90aXRsZSA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoIlN0dWR5IDFhOiBBZHVsdHMiLCBzaXplID0gMTYsIGZvbnRmYWNlID0gJ2JvbGQnLCB4ID0gMCwgaGp1c3QgPSAwKQoKZmlndXJlNC4xYV9wbG90c19sZWdfdGl0bGUgPC0gcGxvdF9ncmlkKGZpZ3VyZTQuMWFfdGl0bGUsIGZpZ3VyZTQuMWFfcGxvdHNfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygwLjEyLCAxKSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNiwgZmlnLmFzcCA9IDAuNH0KZmlndXJlNC4xYV9wbG90c19sZWdfdGl0bGUKYGBgCgojIyMjIEFuYWx5c2lzIG9mIGFzeW1tZXRyaWVzCgpYWAoKIyMjIFN0dWR5IDFiCgpTdHVkeSAxYiB3YXMgYSBkaXJlY3QgcmVwbGljYXRpb24gb2YgU3R1ZHkgMWE6IGByIG5yb3coZDFiX2FkX3dpZGUpYCBVUyBhZHVsdHMgZWFjaCBhc3Nlc3NlZCBhIHNpbmdsZSB0YXJnZXQgY2hhcmFjdGVyIChlaXRoZXIgYSBiZWV0bGUgb3IgYSByb2JvdCkgb24gNDAgbWVudGFsIGNhcGFjaXRpZXMuIChTZWUgQ2hhcHRlciBJSSBhbmQgV2Vpc21hbiBldCBhbC4sIDIwMTcsIGZvciBkZXRhaWxlZCBtZXRob2RzLikKCiMjIyMgU2NhbGUgY29uc3RydWN0aW9uCgpgYGB7cn0Kc2NhbGVzX2VmYV93ZG1fZDFiX2FkIDwtIHNjYWxlX2Z1bihlZmFfd2RtX2QxYl9hZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzID0gZmFjdG9yX25hbWVzX2VmYV93ZG1fZDFiX2FkKQpgYGAKCkZvbGxvd2luZyB0aGUgc3RlcHMgZGVzY3JpYmVkIGluICJHZW5lcmFsIGFuYWx5c2lzIHBsYW4sIiBhYm92ZSwgeWllbGRlZCBgciBmYWN0X25hbWVfZnVuKGZhY3Rvcl9uYW1lc19lZmFfd2RtX2QxYl9hZClgIHNjYWxlcyBvZiBgciBzY2FsZXNfZWZhX3dkbV9kMWJfYWQgJT4lIGNvdW50KGZhY3RvcikgJT4lIHN1bW1hcmlzZShtZWFuID0gbWVhbihuKSkgJT4lIHNlbGVjdChtZWFuKSAlPiUgYXMubnVtZXJpYygpYCBpdGVtcyBlYWNoOyBzZWUgVGFibGUgNC4xLgoKYGBge3J9CmQxYl9hZF9zY29yZWRfYWQgPC0gc2NvcmVfZnVuKGQxYl9hZCwgc2NhbGVzX2VmYV93ZG1fZDFiX2FkKQpgYGAKCiMjIyMgVmlzdWFsaXphdGlvbgoKWFgKCmBgYHtyfQpwbG90c19kMWJfYWRfc2NvcmVkX2FkIDwtIHJlbHZpel9mdW4oZDFiX2FkX3Njb3JlZF9hZCkKYGBgCgpgYGB7cn0KZmlndXJlNC4xYl9wbG90cyA8LSBwbG90X2dyaWQocGxvdHNfZDFiX2FkX3Njb3JlZF9hZFtbMV1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2QxYl9hZF9zY29yZWRfYWRbWzJdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kMWJfYWRfc2NvcmVkX2FkW1szXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQjEiLCAiQjIiLCAiQjMiKSwgbmNvbCA9IDMpCgpmaWd1cmU0LjFiX2xlZyA8LSBnZXRfbGVnZW5kKHBsb3RzX2QxYl9hZF9zY29yZWRfYWRbWzFdXSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV9maWxsX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gY29sb3JzMDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyKSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVfY29sb3JfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjb2xvcnMwMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIpKSkKICAKZmlndXJlNC4xYl9wbG90c19sZWcgPC0gcGxvdF9ncmlkKGZpZ3VyZTQuMWJfcGxvdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWd1cmU0LjFiX2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMC4wNSkpCgpmaWd1cmU0LjFiX3RpdGxlIDwtIGdnZHJhdygpICsgCiAgZHJhd19sYWJlbCgiU3R1ZHkgMWI6IEFkdWx0cyIsIHNpemUgPSAxNiwgZm9udGZhY2UgPSAnYm9sZCcsIHggPSAwLCBoanVzdCA9IDApCgpmaWd1cmU0LjFiX3Bsb3RzX2xlZ190aXRsZSA8LSBwbG90X2dyaWQoZmlndXJlNC4xYl90aXRsZSwgZmlndXJlNC4xYl9wbG90c19sZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDAuMTIsIDEpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA2LCBmaWcuYXNwID0gMC40fQpmaWd1cmU0LjFiX3Bsb3RzX2xlZ190aXRsZQpgYGAKCiMjIyMgQW5hbHlzaXMgb2YgYXN5bW1ldHJpZXMKClhYCgojIyMgU3R1ZHkgMWMKCkluIFN0dWR5IDFjLCBgciBucm93KGQxY19hZF93aWRlKS8yYCBVUyBhZHVsdHMgZWFjaCBhc3Nlc3NlZCB0d28gdGFyZ2V0IGNoYXJhY3RlcnMgb24gNDAgbWVudGFsIGNhcGFjaXRpZXMuIExpa2UgU3R1ZGllcyAxYSBhbmQgMWIsIHRoaXMgc3R1ZHkgZW1wbG95ZWQgdGhlICJlZGdlIGNhc2UiIHZhcmlhbnQgb2YgdGhlIGdlbmVyYWwgYXBwcm9hY2g7IGJ1dCBpbiB0aGlzIHN0dWR5LCBhbGwgcGFydGljaXBhbnRzIGFzc2Vzc2VkIGJvdGggb2YgdGhlc2UgdGFyZ2V0IGNoYXJhY3RlcnMgc2lkZSBieSBzaWRlICh3aXRoIGxlZnQtcmlnaHQgcG9zaXRpb24gY291bnRlcmJhbGFuZWQgYWNyb3NzIHBhcnRpY2lwYW50cykuIChTZWUgQ2hhcHRlciBJSSBhbmQgV2Vpc21hbiBldCBhbC4sIDIwMTcsIGZvciBkZXRhaWxlZCBtZXRob2RzLikKCiMjIyMgU2NhbGUgY29uc3RydWN0aW9uCgpgYGB7cn0Kc2NhbGVzX2VmYV93ZG1fZDFjX2FkIDwtIHNjYWxlX2Z1bihlZmFfd2RtX2QxY19hZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzID0gZmFjdG9yX25hbWVzX2VmYV93ZG1fZDFjX2FkKQpgYGAKCkZvbGxvd2luZyB0aGUgc3RlcHMgZGVzY3JpYmVkIGluICJHZW5lcmFsIGFuYWx5c2lzIHBsYW4sIiBhYm92ZSwgeWllbGRlZCBgciBmYWN0X25hbWVfZnVuKGZhY3Rvcl9uYW1lc19lZmFfd2RtX2QxY19hZClgIHNjYWxlcyBvZiBgciBzY2FsZXNfZWZhX3dkbV9kMWNfYWQgJT4lIGNvdW50KGZhY3RvcikgJT4lIHN1bW1hcmlzZShtZWFuID0gbWVhbihuKSkgJT4lIHNlbGVjdChtZWFuKSAlPiUgYXMubnVtZXJpYygpYCBpdGVtcyBlYWNoOyBzZWUgVGFibGUgNC4xLgoKYGBge3J9CmQxY19hZF9zY29yZWRfYWQgPC0gc2NvcmVfZnVuKGQxY19hZCwgc2NhbGVzX2VmYV93ZG1fZDFjX2FkKQpgYGAKCiMjIyMgVmlzdWFsaXphdGlvbgoKWFgKCmBgYHtyfQpwbG90c19kMWNfYWRfc2NvcmVkX2FkIDwtIHJlbHZpel9mdW4oZDFjX2FkX3Njb3JlZF9hZCkKYGBgCgpgYGB7cn0KZmlndXJlNC4xY19wbG90cyA8LSBwbG90X2dyaWQocGxvdHNfZDFjX2FkX3Njb3JlZF9hZFtbMV1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2QxY19hZF9zY29yZWRfYWRbWzJdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kMWNfYWRfc2NvcmVkX2FkW1szXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQzEiLCAiQzIiLCAiQzMiKSwgbmNvbCA9IDMpCgpmaWd1cmU0LjFjX2xlZyA8LSBnZXRfbGVnZW5kKHBsb3RzX2QxY19hZF9zY29yZWRfYWRbWzFdXSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV9maWxsX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gY29sb3JzMDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyKSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVfY29sb3JfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjb2xvcnMwMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIpKSkKICAKZmlndXJlNC4xY19wbG90c19sZWcgPC0gcGxvdF9ncmlkKGZpZ3VyZTQuMWNfcGxvdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWd1cmU0LjFjX2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMC4wNSkpCgpmaWd1cmU0LjFjX3RpdGxlIDwtIGdnZHJhdygpICsgCiAgZHJhd19sYWJlbCgiU3R1ZHkgMWM6IEFkdWx0cyIsIHNpemUgPSAxNiwgZm9udGZhY2UgPSAnYm9sZCcsIHggPSAwLCBoanVzdCA9IDApCgpmaWd1cmU0LjFjX3Bsb3RzX2xlZ190aXRsZSA8LSBwbG90X2dyaWQoZmlndXJlNC4xY190aXRsZSwgZmlndXJlNC4xY19wbG90c19sZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDAuMTIsIDEpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA2LCBmaWcuYXNwID0gMC40fQpmaWd1cmU0LjFjX3Bsb3RzX2xlZ190aXRsZQpgYGAKCiMjIyMgQW5hbHlzaXMgb2YgYXN5bW1ldHJpZXMKClhYCgojIyMgU3R1ZHkgMWQKCkluIFN0dWR5IDFkLCBgciBucm93KGQxZF9hZF93aWRlKWAgVVMgYWR1bHRzIGVhY2ggYXNzZXNzZWQgYSBzaW5nbGUgdGFyZ2V0IGNoYXJhY3RlciBvbiA0MCBtZW50YWwgY2FwYWNpdGllcy4gVW5saWtlIFN0dWRpZXMgMWEtMWMsIHRoaXMgc3R1ZHkgZW1wbG95ZWQgdGhlICJtYW55IGNoYXJhY3RlcnMiIHZhcmlhbnQgb2YgdGhlIGdlbmVyYWwgYXBwcm9hY2gsIGluIHdoaWNoIHBhcnRpY2lwYW50cyB3ZXJlIHJhbmRvbWx5IGFzc2lnbmVkIHRvIGFzc2VzcyBvbmUgb2YgdGhlIGZvbGxvd2luZyAyMSB0YXJnZXQgY2hhcmFjdGVyczogYW4gYWR1bHQsIGEgY2hpbGQsIGFuIGluZmFudCwgYSBwZXJzb24gaW4gYSBwZXJzaXN0ZW50IHZlZ2V0YXRpdmUgc3RhdGUsIGEgZmV0dXMsIGEgY2hpbXBhbnplZSwgYW4gZWxlcGhhbnQsIGEgZG9scGhpbiwgYSBiZWFyLCBhIGRvZywgYSBnb2F0LCBhIG1vdXNlLCBhIGZyb2csIGEgYmx1ZSBqYXksIGEgZmlzaCwgYSBiZWV0bGUsIGEgbWljcm9iZSwgYSByb2JvdCwgYSBjb21wdXRlciwgYSBjYXIsIG9yIGEgc3RhcGxlci4gKFNlZSBDaGFwdGVyIElJIGFuZCBXZWlzbWFuIGV0IGFsLiwgMjAxNywgZm9yIGRldGFpbGVkIG1ldGhvZHMuKQoKIyMjIyBTY2FsZSBjb25zdHJ1Y3Rpb24KCmBgYHtyfQpzY2FsZXNfZWZhX3dkbV9kMWRfYWQgPC0gc2NhbGVfZnVuKGVmYV93ZG1fZDFkX2FkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBmYWN0b3JfbmFtZXNfZWZhX3dkbV9kMWRfYWQpCmBgYAoKRm9sbG93aW5nIHRoZSBzdGVwcyBkZXNjcmliZWQgaW4gIkdlbmVyYWwgYW5hbHlzaXMgcGxhbiwiIGFib3ZlLCB5aWVsZGVkIGByIGZhY3RfbmFtZV9mdW4oZmFjdG9yX25hbWVzX2VmYV93ZG1fZDFkX2FkKWAgc2NhbGVzIG9mIGByIHNjYWxlc19lZmFfd2RtX2QxZF9hZCAlPiUgY291bnQoZmFjdG9yKSAlPiUgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKG4pKSAlPiUgc2VsZWN0KG1lYW4pICU+JSBhcy5udW1lcmljKClgIGl0ZW1zIGVhY2g7IHNlZSBUYWJsZSA0LjEuCgpgYGB7cn0KZDFkX2FkX3Njb3JlZF9hZCA8LSBzY29yZV9mdW4oZDFkX2FkLCBzY2FsZXNfZWZhX3dkbV9kMWRfYWQpCmBgYAoKIyMjIyBWaXN1YWxpemF0aW9uCgpYWAoKYGBge3J9CnBsb3RzX2QxZF9hZF9zY29yZWRfYWQgPC0gcmVsdml6X2Z1bihkMWRfYWRfc2NvcmVkX2FkLCBjb2xvcnMgPSBjb2xvcnMyMSkKYGBgCgpgYGB7cn0KZmlndXJlNC4xZF9wbG90cyA8LSBwbG90X2dyaWQocGxvdHNfZDFkX2FkX3Njb3JlZF9hZFtbMV1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2QxZF9hZF9zY29yZWRfYWRbWzJdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kMWRfYWRfc2NvcmVkX2FkW1szXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiRDEiLCAiRDIiLCAiRDMiKSwgbmNvbCA9IDMpCgpmaWd1cmU0LjFkX2xlZyA8LSBnZXRfbGVnZW5kKHBsb3RzX2QxZF9hZF9zY29yZWRfYWRbWzFdXSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV9maWxsX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gY29sb3JzMjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSA3KSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVfY29sb3JfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjb2xvcnMyMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDcpKSkKICAKZmlndXJlNC4xZF9wbG90c19sZWcgPC0gcGxvdF9ncmlkKGZpZ3VyZTQuMWRfcGxvdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWd1cmU0LjFkX2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMC4yKSkKCmZpZ3VyZTQuMWRfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTdHVkeSAxZDogQWR1bHRzIiwgc2l6ZSA9IDE2LCBmb250ZmFjZSA9ICdib2xkJywgeCA9IDAsIGhqdXN0ID0gMCkKCmZpZ3VyZTQuMWRfcGxvdHNfbGVnX3RpdGxlIDwtIHBsb3RfZ3JpZChmaWd1cmU0LjFkX3RpdGxlLCBmaWd1cmU0LjFkX3Bsb3RzX2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMC4xMiwgMSkpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDYsIGZpZy5hc3AgPSAwLjQ1fQpmaWd1cmU0LjFkX3Bsb3RzX2xlZ190aXRsZQpgYGAKCiMjIyMgQW5hbHlzaXMgb2YgYXN5bW1ldHJpZXMKClhYCgoKIyMgRGlzY3Vzc2lvbgoKYGBge3J9CnNjYWxlc19zdHVkeTEgPC0gYmluZF9yb3dzKHNjYWxlc19lZmFfd2RtX2QxYV9hZCAlPiUgbXV0YXRlKHN0dWR5ID0gIlN0dWR5IDFhIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlc19lZmFfd2RtX2QxYl9hZCAlPiUgbXV0YXRlKHN0dWR5ID0gIlN0dWR5IDFiIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlc19lZmFfd2RtX2QxY19hZCAlPiUgbXV0YXRlKHN0dWR5ID0gIlN0dWR5IDFjIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlc19lZmFfd2RtX2QxZF9hZCAlPiUgbXV0YXRlKHN0dWR5ID0gIlN0dWR5IDFkIikpICU+JQogIHNlbGVjdCgtYyhsb2FkaW5nLCBvcmRlcikpICU+JQogIGRpc3RpbmN0KCkgJT4lCiAgc3ByZWFkKHN0dWR5LCBmYWN0b3IpICU+JQogIG11dGF0ZSh1cl9mYWN0b3IgPSBpZmVsc2UoIWlzLm5hKGBTdHVkeSAxYWApLCBgU3R1ZHkgMWFgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKCFpcy5uYShgU3R1ZHkgMWJgKSwgYFN0dWR5IDFiYCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoIWlzLm5hKGBTdHVkeSAxY2ApLCBgU3R1ZHkgMWNgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgU3R1ZHkgMWRgKSkpKSAlPiUKICBsZWZ0X2pvaW4oc2NhbGVzX2VmYV93ZG1fZDFhX2FkICU+JSAKICAgICAgICAgICAgICBzZWxlY3QoY2FwYWNpdHksIG9yZGVyKSAlPiUgcmVuYW1lKG9yZGVyMWEgPSBvcmRlcikpICU+JQogIGxlZnRfam9pbihzY2FsZXNfZWZhX3dkbV9kMWJfYWQgJT4lIAogICAgICAgICAgICAgIHNlbGVjdChjYXBhY2l0eSwgb3JkZXIpICU+JSByZW5hbWUob3JkZXIxYiA9IG9yZGVyKSkgJT4lCiAgbGVmdF9qb2luKHNjYWxlc19lZmFfd2RtX2QxY19hZCAlPiUgCiAgICAgICAgICAgICAgc2VsZWN0KGNhcGFjaXR5LCBvcmRlcikgJT4lIHJlbmFtZShvcmRlcjFjID0gb3JkZXIpKSAlPiUKICBsZWZ0X2pvaW4oc2NhbGVzX2VmYV93ZG1fZDFkX2FkICU+JSAKICAgICAgICAgICAgICBzZWxlY3QoY2FwYWNpdHksIG9yZGVyKSAlPiUgcmVuYW1lKG9yZGVyMWQgPSBvcmRlcikpICU+JQogIGFycmFuZ2UodXJfZmFjdG9yLCBvcmRlcjFhLCBvcmRlcjFiLCBvcmRlcjFjLCBvcmRlcjFkKSAlPiUKICBzZWxlY3QoLWModXJfZmFjdG9yLCBzdGFydHNfd2l0aCgib3JkZXIiKSkpCmBgYAoKYGBge3J9CnRhYmxlNC4xIDwtIHNjYWxlc19zdHVkeTEgJT4lCiAgbXV0YXRlX2F0KHZhcnMoLWNhcGFjaXR5KSwKICAgICAgICAgICAgZnVucyhpZmVsc2UoaXMubmEoLiksICIiLCAi4pyTIikpKSAlPiUKICByZW5hbWUoQ2FwYWNpdHkgPSBjYXBhY2l0eSkgJT4lCiAga2FibGUoZm9ybWF0ID0gImh0bWwiLCAKICAgICAgICBjYXB0aW9uID0gIlRhYmxlIDQuMTogU2NhbGVzIGZvciBlYWNoIG9mIHRoZSBjb25jZXB0dWFsIHVuaXRzIChmYWN0b3JzKSBpZGVudGlmaWVkIGJ5IEVGQSBmb3IgVVMgQWR1bHRzIGluIFN0dWRpZXMgMWEtMWQgKHNlZSBDaGFwdGVyIElJSSkuIEEgY2hlY2ttYXJrIGluZGljYXRlcyB0aGF0IGEgbWVudGFsIGNhcGFjaXR5IHdhcyBpbmNsdWRlZCBpbiBhIHNjYWxlIGZvciBhIHBhcnRpY3VsYXIgc3R1ZHkuIikgJT4lICAKICBrYWJsZV9zdHlsaW5nKCkgJT4lCiAgZ3JvdXBfcm93cygiQk9EWSBzY2FsZSIsIDEsIDkpICU+JQogIGdyb3VwX3Jvd3MoIkhFQVJUIHNjYWxlIiwgMTAsIDE3KSAlPiUKICBncm91cF9yb3dzKCJNSU5EIHNjYWxlIiwgMTgsIDI2KQpgYGAKCmBgYHtyIHRhYmxlNC4xLCBpbmNsdWRlID0gVH0KdGFibGU0LjEKYGBgCgpgYGB7cn0KZmlndXJlNC4xIDwtIHBsb3RfZ3JpZChmaWd1cmU0LjFhX3Bsb3RzX2xlZ190aXRsZSwgZmlndXJlNC4xYl9wbG90c19sZWdfdGl0bGUsCiAgICAgICAgICAgICAgICAgICAgICAgZmlndXJlNC4xY19wbG90c19sZWdfdGl0bGUsIGZpZ3VyZTQuMWRfcGxvdHNfbGVnX3RpdGxlLCAKICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDEsIDEsIDEuMTUpKQoKZmlndXJlNC4xX2NhcCA8LSBhZGRfc3ViKGZpZ3VyZTQuMSwgc3RyX3dyYXAoIkZpZ3VyZSA0LjE6IFJlbGF0aW9uc2hpcHMgYW1vbmcgVVMgYWR1bHRzJyBhdHRyaWJ1dGlvbnMgb2YgY29uY2VwdHVhbCB1bml0cyBpbiBTdHVkaWVzIDFhLTFkLCBvcmdhbml6ZWQgYnkgc3R1ZHkgKHJvd3MpIGFuZCBwYWlyIG9mIGNvbmNlcHR1YWwgdW5pdHMgKGNvbHVtbnMpLiBGb3IgZWFjaCBjb25jZXB0dWFsIHVuaXQsIHNjb3JlcyBjb3VsZCByYW5nZSBmcm9tIDAtMS4gSW5kaXZpZHVhbCBwYXJ0aWNpcGFudHMgYXJlIHBsb3R0ZWQgYXMgc21hbGwsIHRyYW5zbHVjZW50IGNpcmNsZXMsIGFuZCBtZWFuIHNjb3JlcyBieSBjaGFyYWN0ZXIgYXJlIHBsb3R0ZWQgYXMgbGFyZ2VyLCBzb2xpZCBkaWFtb25kcy4gRXJyb3IgYmFycyBhcmUgOTUlIGJvb3RzdHJhcHBlZCBjb25maWRlbmNlIGludGVydmFscy4gVGhlIGRvdHRlZCBsaW5lIGNvcnJlc3BvbmRzIHRvIGVxdWFsIGVuZG9yc2VtZW50cyBvZiB0aGUgdHdvIGNvbmNlcHR1YWwgdW5pdHMgcGxvdHRlZC4iLCAxMTApLCB4ID0gMCwgaGp1c3QgPSAwKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVCwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDEuOH0KZ2dkcmF3KGZpZ3VyZTQuMV9jYXApCmBgYAoKWFgKCgojIFN0dWR5IDI6IENvbmNlcHR1YWwgY2hhbmdlIGJldHdlZW4gbWlkZGxlIGNoaWxkaG9vZCAoNy05eSkgYW5kIGFkdWx0aG9vZAoKSW4gU3R1ZHkgMiwgYHIgbnJvdyhkMl9hZF93aWRlKWAgVVMgYWR1bHRzIGFuZCBgciBucm93KGQyXzc5X3dpZGUpYCBVUyBjaGlsZHJlbiBiZXR3ZWVuIHRoZSBhZ2VzIG9mIGByIHN1bW1hcnkoZDJfNzkkYWdlKVsiTWluLiJdICU+JSByb3VuZCgyKWAtYHIgc3VtbWFyeShkMl83OSRhZ2UpWyJNYXguIl0gJT4lIHJvdW5kKDIpYCB5ZWFycyAobWVkaWFuOiBgciBzdW1tYXJ5KGQyXzc5JGFnZSlbIk1lZGlhbiJdICU+JSByb3VuZCgyKWB5KSBlYWNoIGFzc2Vzc2VkIGEgc2luZ2xlIHRhcmdldCBjaGFyYWN0ZXIgb24gNDAgbWVudGFsIGNhcGFjaXRpZXMuIFRvIG1ha2UgdGhlIHN0dWR5IGFwcHJvcHJpYXRlIGZvciBjaGlsZHJlbiBpbiB0aGlzIGFnZSByYW5nZSwgdGhlIHdvcmRpbmcgb2Ygc29tZSB0aGUgNDAgbWVudGFsIGNhcGFjaXRpZXMgZW1wbG95ZWQgaW4gU3R1ZHkgMSB3YXMgbW9kaWZpZWQgdG8gdXNlIG1vcmUgYWdlLWFwcHJvcHJpYXRlIHZvY2FidWxhcnksIGFuZCBwYXJ0aWNpcGFudHMgcmVzcG9uZGVkIG9uIGEgMy1wb2ludCBzY2FsZSAoIm5vLCIgY29kZWQgYXMgMDsgImtpbmRhLCIgY29kZWQgYXMgMC41LCAieWVzLCIgY29kZWQgYXMgMSkuIFRoaXMgc3R1ZHkgZW1wbG95ZWQgdGhlICJlZGdlIGNhc2UiIHZhcmlhbnQgb2YgdGhlIGdlbmVyYWwgYXBwcm9hY2gsIHdpdGggcGFydGljaXBhbnRzIHJhbmRvbWx5IGFzc2lnbmVkIHRvIGFzc2VzcyBlaXRoZXIgYSBiZWV0bGUgb3IgYSByb2JvdC4gKFNlZSBDaGFwdGVyIElJIGZvciBkZXRhaWxlZCBtZXRob2RzLikKCiMjIFNwZWNpYWwgbm90ZXMgb24gZGF0YSBwcm9jZXNzaW5nIGFuZCBhbmFseXNpcwoKIyMgUmVzdWx0cwoKIyMjIEFkdWx0cwoKIyMjIyBTY2FsZSBjb25zdHJ1Y3Rpb24KCmBgYHtyfQpzY2FsZXNfZWZhX3dkbV9kMl9hZCA8LSBzY2FsZV9mdW4oZWZhX3dkbV9kMl9hZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGZhY3Rvcl9uYW1lc19lZmFfd2RtX2QyX2FkKQpgYGAKCkZvbGxvd2luZyB0aGUgc3RlcHMgZGVzY3JpYmVkIGluICJHZW5lcmFsIGFuYWx5c2lzIHBsYW4sIiBhYm92ZSwgeWllbGRlZCBgciBmYWN0X25hbWVfZnVuKGZhY3Rvcl9uYW1lc19lZmFfd2RtX2QyX2FkKWAgc2NhbGVzIG9mIGByIHNjYWxlc19lZmFfd2RtX2QyX2FkICU+JSBjb3VudChmYWN0b3IpICU+JSBzdW1tYXJpc2UobWVhbiA9IG1lYW4obikpICU+JSBzZWxlY3QobWVhbikgJT4lIGFzLm51bWVyaWMoKWAgaXRlbXMgZWFjaDsgc2VlIFRhYmxlIDQuMi4KCmBgYHtyfQpkMl9hZF9zY29yZWRfYWQgPC0gc2NvcmVfZnVuKGQyX2FkLCBzY2FsZXNfZWZhX3dkbV9kMl9hZCkKYGBgCgojIyMjIFZpc3VhbGl6YXRpb24KCmBgYHtyfQpwbG90c19kMl9hZF9zY29yZWRfYWQgPC0gcmVsdml6X2Z1bihkMl9hZF9zY29yZWRfYWQpCmBgYAoKYGBge3J9CmZpZ3VyZTQuMmFfcGxvdHMgPC0gcGxvdF9ncmlkKHBsb3RzX2QyX2FkX3Njb3JlZF9hZFtbMV1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2QyX2FkX3Njb3JlZF9hZFtbMl1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2QyX2FkX3Njb3JlZF9hZFtbM11dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkExIiwgIkEyIiwgIkEzIiksIG5jb2wgPSAzKQoKZmlndXJlNC4yYV9sZWcgPC0gZ2V0X2xlZ2VuZChwbG90c19kMl9hZF9zY29yZWRfYWRbWzFdXSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV9maWxsX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gY29sb3JzMDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyKSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVfY29sb3JfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjb2xvcnMwMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIpKSkKICAKZmlndXJlNC4yYV9wbG90c19sZWcgPC0gcGxvdF9ncmlkKGZpZ3VyZTQuMmFfcGxvdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWd1cmU0LjJhX2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMC4wNSkpCgpmaWd1cmU0LjJhX3RpdGxlIDwtIGdnZHJhdygpICsgCiAgZHJhd19sYWJlbCgiU3R1ZHkgMjogQWR1bHRzIiwgc2l6ZSA9IDE2LCBmb250ZmFjZSA9ICdib2xkJywgeCA9IDAsIGhqdXN0ID0gMCkKCmZpZ3VyZTQuMmFfcGxvdHNfbGVnX3RpdGxlIDwtIHBsb3RfZ3JpZChmaWd1cmU0LjJhX3RpdGxlLCBmaWd1cmU0LjJhX3Bsb3RzX2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMC4xMiwgMSkpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDYsIGZpZy5hc3AgPSAwLjR9CmZpZ3VyZTQuMmFfcGxvdHNfbGVnX3RpdGxlCmBgYAoKWFgKCiMjIyMgQW5hbHlzaXMgb2YgYXN5bW1ldHJpZXMKClhYCgojIyMgQ2hpbGRyZW4gKDctOXkpCgojIyMjIFNjYWxlIGNvbnN0cnVjdGlvbgoKYGBge3J9CnNjYWxlc19lZmFfd2RtX2QyXzc5IDwtIHNjYWxlX2Z1bihlZmFfd2RtX2QyXzc5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzID0gZmFjdG9yX25hbWVzX2VmYV93ZG1fZDJfNzkpCmBgYAoKRm9sbG93aW5nIHRoZSBzdGVwcyBkZXNjcmliZWQgaW4gIkdlbmVyYWwgYW5hbHlzaXMgcGxhbiwiIGFib3ZlLCB5aWVsZGVkIGByIGZhY3RfbmFtZV9mdW4oZmFjdG9yX25hbWVzX2VmYV93ZG1fZDJfNzkpYCBzY2FsZXMgb2YgYHIgc2NhbGVzX2VmYV93ZG1fZDJfNzkgJT4lIGNvdW50KGZhY3RvcikgJT4lIHN1bW1hcmlzZShtZWFuID0gbWVhbihuKSkgJT4lIHNlbGVjdChtZWFuKSAlPiUgYXMubnVtZXJpYygpYCBpdGVtcyBlYWNoOyBzZWUgVGFibGUgNC4yLgoKYGBge3J9CmQyXzc5X3Njb3JlZF9hZCA8LSBzY29yZV9mdW4oZDJfNzksIHNjYWxlc19lZmFfd2RtX2QyX2FkKQpkMl83OV9zY29yZWRfNzkgPC0gc2NvcmVfZnVuKGQyXzc5LCBzY2FsZXNfZWZhX3dkbV9kMl83OSkKYGBgCgojIyMjIFZpc3VhbGl6YXRpb24KCiMjIyMjIFVzaW5nIGFkdWx0cycgc2NhbGVzCgpYWAoKYGBge3J9CnBsb3RzX2QyXzc5X3Njb3JlZF9hZCA8LSByZWx2aXpfZnVuKGQyXzc5X3Njb3JlZF9hZCkKYGBgCgpgYGB7cn0KZmlndXJlNC4yYl9wbG90cyA8LSBwbG90X2dyaWQocGxvdHNfZDJfNzlfc2NvcmVkX2FkW1sxXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfZDJfNzlfc2NvcmVkX2FkW1syXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfZDJfNzlfc2NvcmVkX2FkW1szXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQjEiLCAiQjIiLCAiQjMiKSwgbmNvbCA9IDMpCgpmaWd1cmU0LjJiX2xlZyA8LSBnZXRfbGVnZW5kKHBsb3RzX2QyXzc5X3Njb3JlZF9hZFtbMV1dICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX2ZpbGxfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjb2xvcnMwMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIpKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV9jb2xvcl9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGNvbG9yczAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMikpKQogIApmaWd1cmU0LjJiX3Bsb3RzX2xlZyA8LSBwbG90X2dyaWQoZmlndXJlNC4yYl9wbG90cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZ3VyZTQuMmJfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAwLjA1KSkKCmZpZ3VyZTQuMmJfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTdHVkeSAyOiBDaGlsZHJlbiwgNy05eSAoc2NvcmVkIHVzaW5nIGFkdWx0cycgc2NhbGVzKSIsIAogICAgICAgICAgICAgc2l6ZSA9IDE2LCBmb250ZmFjZSA9ICdib2xkJywgeCA9IDAsIGhqdXN0ID0gMCkKCmZpZ3VyZTQuMmJfcGxvdHNfbGVnX3RpdGxlIDwtIHBsb3RfZ3JpZChmaWd1cmU0LjJiX3RpdGxlLCBmaWd1cmU0LjJiX3Bsb3RzX2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMC4xMiwgMSkpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDYsIGZpZy5hc3AgPSAwLjR9CmZpZ3VyZTQuMmJfcGxvdHNfbGVnX3RpdGxlCmBgYAoKYGBge3J9CnBsb3RzX2FnZWdwX2QyX3Njb3JlZF9hZCA8LSByZWx2aXpfYWdlZ3BfZnVuKAogIGRfc2NvcmVkID0gZDJfYWRfc2NvcmVkX2FkICU+JSBmdWxsX2pvaW4oZDJfNzlfc2NvcmVkX2FkKSwgCiAgYWdlX2dyb3VwcyA9IGMoImNoaWxkcmVuNzkiLCAiYWR1bHRzIiksCiAgYWdlX2dyb3VwX2xhYmVscyA9IGMoIkNoaWxkcmVuICg3LTl5KSIsICJBZHVsdHMiKSkKYGBgCgpgYGB7cn0KZmlndXJlNC4yYWxsX3Bsb3RzIDwtIHBsb3RfZ3JpZChwbG90c19hZ2VncF9kMl9zY29yZWRfYWRbWzFdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19hZ2VncF9kMl9zY29yZWRfYWRbWzJdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19hZ2VncF9kMl9zY29yZWRfYWRbWzNdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJDMSIsICJDMiIsICJDMyIpLCBuY29sID0gMykKCmZpZ3VyZTQuMmFsbF9sZWcgPC0gZ2V0X2xlZ2VuZChwbG90c19hZ2VncF9kMl9zY29yZWRfYWRbWzFdXSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV9jb2xvcl9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGNvbG9yczAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnRyYW5zbGF0ZSA9IEYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyKSkpCiAgCmZpZ3VyZTQuMmFsbF9wbG90c19sZWcgPC0gcGxvdF9ncmlkKGZpZ3VyZTQuMmFsbF9wbG90cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZ3VyZTQuMmFsbF9sZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDAuMDUpKQoKZmlndXJlNC4yYWxsX3RpdGxlIDwtIGdnZHJhdygpICsgCiAgZHJhd19sYWJlbCgiVHJhY2tpbmcgZGV2ZWxvcG1lbnQgYmV0d2VlbiA3LTl5IGFuZCBhZHVsdGhvb2QgKHNjb3JlZCB1c2luZyBhZHVsdHMnIHNjYWxlcykiLCAKICAgICAgICAgICAgIHNpemUgPSAxNiwgZm9udGZhY2UgPSAnYm9sZCcsIHggPSAwLCBoanVzdCA9IDApCgpmaWd1cmU0LjJhbGxfcGxvdHNfbGVnX3RpdGxlIDwtIHBsb3RfZ3JpZChmaWd1cmU0LjJhbGxfdGl0bGUsIGZpZ3VyZTQuMmFsbF9wbG90c19sZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDAuMTIsIDEpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA2LCBmaWcuYXNwID0gMC40fQpmaWd1cmU0LjJhbGxfcGxvdHNfbGVnX3RpdGxlCmBgYAoKCiMjIyMjIFVzaW5nIGNoaWxkcmVuJ3Mgb3duIHNjYWxlcwoKWFgKCmBgYHtyfQpwbG90c19kMl83OV9zY29yZWRfNzkgPC0gcmVsdml6X2Z1bihkMl83OV9zY29yZWRfNzkpCmBgYAoKYGBge3J9CmZpZ3VyZTQuMmNfcGxvdHMgPC0gcGxvdF9ncmlkKHBsb3RzX2QyXzc5X3Njb3JlZF83OVtbMV1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2QyXzc5X3Njb3JlZF83OVtbMl1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2QyXzc5X3Njb3JlZF83OVtbM11dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkExIiwgIkEyIiwgIkEzIiksIG5jb2wgPSAzKQoKZmlndXJlNC4yY19sZWcgPC0gZ2V0X2xlZ2VuZChwbG90c19kMl83OV9zY29yZWRfNzlbWzFdXSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV9maWxsX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gY29sb3JzMDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyKSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVfY29sb3JfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjb2xvcnMwMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIpKSkKICAKZmlndXJlNC4yY19wbG90c19sZWcgPC0gcGxvdF9ncmlkKGZpZ3VyZTQuMmNfcGxvdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWd1cmU0LjJjX2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMC4wNSkpCgpmaWd1cmU0LjJjX3RpdGxlIDwtIGdnZHJhdygpICsgCiAgZHJhd19sYWJlbCgiU3R1ZHkgMjogQ2hpbGRyZW4sIDctOXkgKHNjb3JlZCB1c2luZyB0aGVpciBvd24gc2NhbGVzKSIsIAogICAgICAgICAgICAgc2l6ZSA9IDE2LCBmb250ZmFjZSA9ICdib2xkJywgeCA9IDAsIGhqdXN0ID0gMCkKCmZpZ3VyZTQuMmNfcGxvdHNfbGVnX3RpdGxlIDwtIHBsb3RfZ3JpZChmaWd1cmU0LjJjX3RpdGxlLCBmaWd1cmU0LjJjX3Bsb3RzX2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMC4xMiwgMSkpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDYsIGZpZy5hc3AgPSAwLjR9CmZpZ3VyZTQuMmNfcGxvdHNfbGVnX3RpdGxlCmBgYAoKIyMjIyBBbmFseXNpcyBvZiBhc3ltbWV0cmllcwoKWFgKCiMjIERpc2N1c3Npb24KClhYCgpgYGB7cn0Kc2NhbGVzX3N0dWR5MiA8LSBiaW5kX3Jvd3Moc2NhbGVzX2VmYV93ZG1fZDJfYWQgJT4lIG11dGF0ZShzdHVkeSA9ICJBZHVsdHMiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVzX2VmYV93ZG1fZDJfNzkgJT4lIG11dGF0ZShzdHVkeSA9ICJDaGlsZHJlbiwgNy05eSIpKSAlPiUKICBzZWxlY3QoLWMobG9hZGluZywgb3JkZXIpKSAlPiUKICBkaXN0aW5jdCgpICU+JQogIHNwcmVhZChzdHVkeSwgZmFjdG9yKSAlPiUKICBtdXRhdGUodXJfZmFjdG9yID0gaWZlbHNlKCFpcy5uYShgQWR1bHRzYCksIGBBZHVsdHNgLCBgQ2hpbGRyZW4sIDctOXlgKSkgJT4lCiAgbGVmdF9qb2luKHNjYWxlc19lZmFfd2RtX2QyX2FkICU+JSAKICAgICAgICAgICAgICBzZWxlY3QoY2FwYWNpdHksIG9yZGVyKSAlPiUgcmVuYW1lKG9yZGVyX2FkID0gb3JkZXIpKSAlPiUKICBsZWZ0X2pvaW4oc2NhbGVzX2VmYV93ZG1fZDJfNzkgJT4lIAogICAgICAgICAgICAgIHNlbGVjdChjYXBhY2l0eSwgb3JkZXIpICU+JSByZW5hbWUob3JkZXJfNzkgPSBvcmRlcikpICU+JQogIGFycmFuZ2UodXJfZmFjdG9yLCBvcmRlcl9hZCwgb3JkZXJfNzkpICU+JQogIHNlbGVjdCgtYyh1cl9mYWN0b3IsIHN0YXJ0c193aXRoKCJvcmRlciIpKSkKYGBgCgpgYGB7cn0KdGFibGU0LjIgPC0gc2NhbGVzX3N0dWR5MiAlPiUKICBtdXRhdGVfYXQodmFycygtY2FwYWNpdHkpLAogICAgICAgICAgICBmdW5zKGlmZWxzZShpcy5uYSguKSwgIiIsICLinJMiKSkpICU+JQogIHJlbmFtZShDYXBhY2l0eSA9IGNhcGFjaXR5KSAlPiUKICBrYWJsZShmb3JtYXQgPSAiaHRtbCIsCiAgICAgICAgY2FwdGlvbiA9ICJUYWJsZSA0LjI6IFNjYWxlcyBmb3IgZWFjaCBvZiB0aGUgY29uY2VwdHVhbCB1bml0cyAoZmFjdG9ycykgaWRlbnRpZmllZCBieSBFRkEgZm9yIFVTIEFkdWx0cyBhbmQgY2hpbGRyZW4gaW4gU3R1ZHkgMiAoc2VlIENoYXB0ZXIgSUlJKS4gQSBjaGVja21hcmsgaW5kaWNhdGVzIHRoYXQgYSBtZW50YWwgY2FwYWNpdHkgd2FzIGluY2x1ZGVkIGluIGEgc2NhbGUgZm9yIGEgcGFydGljdWxhciBzYW1wbGUuIikgJT4lCiAga2FibGVfc3R5bGluZygpICU+JQogIGdyb3VwX3Jvd3MoIkJPRFkgc2NhbGUiLCAxLCA3KSAlPiUKICBncm91cF9yb3dzKCJIRUFSVCBzY2FsZSIsIDgsIDE0KSAlPiUKICBncm91cF9yb3dzKCJNSU5EIHNjYWxlIiwgMTUsIDIzKQpgYGAKCmBgYHtyIHRhYmxlNC4yLCBpbmNsdWRlID0gVH0KdGFibGU0LjIKYGBgCgpgYGB7cn0KZmlndXJlNC4yIDwtIHBsb3RfZ3JpZChmaWd1cmU0LjJhX3Bsb3RzX2xlZ190aXRsZSwgZmlndXJlNC4yYl9wbG90c19sZWdfdGl0bGUsCiAgICAgICAgICAgICAgICAgICAgICAgZmlndXJlNC4yYWxsX3Bsb3RzX2xlZ190aXRsZSwKICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSkKCmZpZ3VyZTQuMl9jYXAgPC0gYWRkX3N1YihmaWd1cmU0LjIsIHN0cl93cmFwKCJGaWd1cmUgNC4yOiBSZWxhdGlvbnNoaXBzIGFtb25nIFVTIGFkdWx0cycsIG9sZGVyIGNoaWxkcmVuJ3MsIGFuZCB5b3VuZ2VyIGNoaWxkcmVuJ3MgYXR0cmlidXRpb25zIG9mIGNvbmNlcHR1YWwgdW5pdHMgaW4gU3R1ZHkgMiwgc2NvcmVkIHVzaW5nIGFkdWx0cycgQk9EWSwgSEVBUlQsIGFuZCBNSU5EIHNjYWxlcyAoc2VlIFRhYmxlIDQuMikuIFBsb3RzIGFyZSBvcmdhbml6ZWQgYnkgc2FtcGxlIChyb3dzKSBhbmQgYnkgcGFpciBvZiBjb25jZXB0dWFsIHVuaXRzIChjb2x1bW5zKS4gKEEpIEFkdWx0cy4gKEIpIENoaWxkcmVuICg3LTl5IG9mIGFnZSksIHNjb3JlZCB1c2luZyBhZHVsdHMnIHNjYWxlcy4gKEMpIEEgdmlzdWFsaXphdGlvbiBvZiBkZXZlbG9wbWVudCBiZXR3ZWVuIDctOXkgYW5kIGFkdWx0aG9vZCwgdXNpbmcgbWVhbiBzY29yZXMgYnkgY2hhcmFjdGVyIGFuZCBhZ2UgZ3JvdXAuIEZvciBlYWNoIGNvbmNlcHR1YWwgdW5pdCwgc2NvcmVzIGNvdWxkIHJhbmdlIGZyb20gMC0xLiBJbiBwYW5lbHMgQS1CLCBpbmRpdmlkdWFsIHBhcnRpY2lwYW50cyBhcmUgcGxvdHRlZCBhcyBzbWFsbCwgdHJhbnNsdWNlbnQgY2lyY2xlcywgYW5kIG1lYW4gc2NvcmVzIGJ5IGNoYXJhY3RlciBhcmUgcGxvdHRlZCBhcyBsYXJnZXIsIHNvbGlkIGRpYW1vbmRzLiBFcnJvciBiYXJzIGFyZSA5NSUgYm9vdHN0cmFwcGVkIGNvbmZpZGVuY2UgaW50ZXJ2YWxzLiBUaGUgZG90dGVkIGxpbmUgY29ycmVzcG9uZHMgdG8gZXF1YWwgZW5kb3JzZW1lbnRzIG9mIHRoZSB0d28gY29uY2VwdHVhbCB1bml0cyBwbG90dGVkLiIsIDExMCksIHggPSAwLCBoanVzdCA9IDApCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBULCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMS40fQpnZ2RyYXcoZmlndXJlNC4yX2NhcCkKYGBgCgpgYGB7cn0KZmlndXJlNC4zIDwtIHBsb3RfZ3JpZChmaWd1cmU0LjJjX3Bsb3RzX2xlZ190aXRsZSwgCiAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEpCgpmaWd1cmU0LjNfY2FwIDwtIGFkZF9zdWIoZmlndXJlNC4zLCBzdHJfd3JhcCgiRmlndXJlIDQuMzogUmVsYXRpb25zaGlwcyBhbW9uZyBjaGlsZHJlbidzIGF0dHJpYnV0aW9ucyBvZiBjb25jZXB0dWFsIHVuaXRzIGluIFN0dWR5IDIsIHNjb3JlZCB1c2luZyB0aGVpciBvd24gc2NhbGVzIChzZWUgVGFibGUgNC4zKS4gUGxvdHMgYXJlIG9yZ2FuaXplZCBieSBwYWlyIG9mIGNvbmNlcHR1YWwgdW5pdHMgKGNvbHVtbnMpLiBGb3IgZWFjaCBjb25jZXB0dWFsIHVuaXQsIHNjb3JlcyBjb3VsZCByYW5nZSBmcm9tIDAtMS4gSW5kaXZpZHVhbCBwYXJ0aWNpcGFudHMgYXJlIHBsb3R0ZWQgYXMgc21hbGwsIHRyYW5zbHVjZW50IGNpcmNsZXMsIGFuZCBtZWFuIHNjb3JlcyBieSBjaGFyYWN0ZXIgYXJlIHBsb3R0ZWQgYXMgbGFyZ2VyLCBzb2xpZCBkaWFtb25kcy4gRXJyb3IgYmFycyBhcmUgOTUlIGJvb3RzdHJhcHBlZCBjb25maWRlbmNlIGludGVydmFscy4gVGhlIGRvdHRlZCBsaW5lIGNvcnJlc3BvbmRzIHRvIGVxdWFsIGVuZG9yc2VtZW50cyBvZiB0aGUgdHdvIGNvbmNlcHR1YWwgdW5pdHMgcGxvdHRlZC4iLCAxMTApLCB4ID0gMCwgaGp1c3QgPSAwKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVCwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuNX0KZ2dkcmF3KGZpZ3VyZTQuM19jYXApCmBgYAoKCiMgU3R1ZHkgMzogQ29uY2VwdHVhbCBjaGFuZ2Ugb3ZlciBlYXJseSBhbmQgbWlkZGxlIGNoaWxkaG9vZCAoNC05eSkKCkluIFN0dWR5IDMsIGByIG5yb3coZDNfYWRfd2lkZSlgIFVTIGFkdWx0cywgYHIgbnJvdyhkM183OV93aWRlKWAgIm9sZGVyIiBjaGlsZHJlbiAoYHIgc3VtbWFyeShkM183OSRhZ2UpWyJNaW4uIl0gJT4lIHJvdW5kKDIpYC1gciBzdW1tYXJ5KGQzXzc5JGFnZSlbIk1heC4iXSAlPiUgcm91bmQoMilgIHllYXJzOyBtZWRpYW46IGByIHN1bW1hcnkoZDNfNzkkYWdlKVsiTWVkaWFuIl0gJT4lIHJvdW5kKDIpYHkpLCBhbmQgYHIgbnJvdyhkM180Nl93aWRlKWAgInlvdW5nZXIiIGNoaWxkcmVuIChgciBzdW1tYXJ5KGQzXzQ2JGFnZSlbIk1pbi4iXSAlPiUgcm91bmQoMilgLWByIHN1bW1hcnkoZDNfNDYkYWdlKVsiTWF4LiJdICU+JSByb3VuZCgyKWAgeWVhcnM7IG1lZGlhbjogYHIgc3VtbWFyeShkM180NiRhZ2UpWyJNZWRpYW4iXSAlPiUgcm91bmQoMilgeSkgZWFjaCBhc3Nlc3NlZCBhIHNpbmdsZSB0YXJnZXQgY2hhcmFjdGVyIG9uIDIwIG1lbnRhbCBjYXBhY2l0aWVzLiBUbyBtYWtlIHRoZSBzdHVkeSBhcHByb3ByaWF0ZSBmb3IgY2hpbGRyZW4gaW4gdGhpcyBhZ2UgcmFuZ2UsIHBhcnRpY2lwYW50cyBhc3Nlc3NlZCBhIHN1YnNldCBvZiB0aGUgNDAgbWVudGFsIGNhcGFjaXRpZXMgZW1wbG95ZWQgaW4gU3R1ZHkgMiwgY2hvc2VuIHRvIHJlcHJlc2VudCB0aGUgdGhyZWUgImNvbmNlcHR1YWwgdW5pdHMiIHJldmVhbGVkIGJ5IFN0dWRpZXMgMS0yIChCT0RZLCBIRUFSVCwgYW5kIE1JTkQpIGFuZCB0byBjb3ZlciBhIHNpbWlsYXIgcmFuZ2Ugb2YgbWVudGFsIGNhcGFjaXRpZXMgYXMgU3R1ZGllcyAxLTIuIEFzIGluIFN0dWR5IDIsIHBhcnRpY2lwYW50cyByZXNwb25kZWQgb24gYSAzLXBvaW50IHNjYWxlICgibm8sIiBjb2RlZCBhcyAwOyAia2luZGEsIiBjb2RlZCBhcyAwLjUsICJ5ZXMsIiBjb2RlZCBhcyAxKS4gVGhpcyBzdHVkeSBlbXBsb3llZCB0aGUgImRpdmVyc2UgY2hhcmFjdGVycyIgdmFyaWFudCBvZiB0aGUgZ2VuZXJhbCBhcHByb2FjaCwgd2l0aCBwYXJ0aWNpcGFudHMgcmFuZG9tbHkgb3IgcHNldWRvLXJhbmRvbWx5IGFzc2lnbmVkIHRvIGFzc2VzcyBlaXRoZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgOSBjaGFyYWN0ZXJzOiBhbiBlbGVwaGFudCwgYSBnb2F0LCBhIG1vdXNlLCBhIGJpcmQsIGEgYmVldGxlLCBhIHRlZGR5IGJlYXIsIGEgZG9sbCwgYSByb2JvdCwgb3IgYSBjb21wdXRlci4gKFNlZSBDaGFwdGVyIElJIGZvciBkZXRhaWxlZCBtZXRob2RzLikKCiMjIFNwZWNpYWwgbm90ZXMgb24gZGF0YSBwcm9jZXNzaW5nIGFuZCBhbmFseXNpcwoKIyMgUmVzdWx0cwoKIyMjIEFkdWx0cwoKIyMjIyBTY2FsZSBjb25zdHJ1Y3Rpb24KCmBgYHtyfQpzY2FsZXNfZWZhX3dkbV9kM19hZCA8LSBzY2FsZV9mdW4oZWZhX3dkbV9kM19hZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGZhY3Rvcl9uYW1lc19lZmFfd2RtX2QzX2FkKQpgYGAKCkZvbGxvd2luZyB0aGUgc3RlcHMgZGVzY3JpYmVkIGluICJHZW5lcmFsIGFuYWx5c2lzIHBsYW4sIiBhYm92ZSwgeWllbGRlZCBgciBmYWN0X25hbWVfZnVuKGZhY3Rvcl9uYW1lc19lZmFfd2RtX2QzX2FkKWAgc2NhbGVzIG9mIGByIHNjYWxlc19lZmFfd2RtX2QzX2FkICU+JSBjb3VudChmYWN0b3IpICU+JSBzdW1tYXJpc2UobWVhbiA9IG1lYW4obikpICU+JSBzZWxlY3QobWVhbikgJT4lIGFzLm51bWVyaWMoKWAgaXRlbXMgZWFjaDsgc2VlIFRhYmxlIDQuMy4KCmBgYHtyfQpkM19hZF9zY29yZWRfYWQgPC0gc2NvcmVfZnVuKGQzX2FkLCBzY2FsZXNfZWZhX3dkbV9kM19hZCkKYGBgCgojIyMjIFZpc3VhbGl6YXRpb24KClhYCgpgYGB7cn0KcGxvdHNfZDNfYWRfc2NvcmVkX2FkIDwtIHJlbHZpel9mdW4oZDNfYWRfc2NvcmVkX2FkLCBjb2xvcnMgPSBjb2xvcnMwOSkKYGBgCgpgYGB7cn0KZmlndXJlNC4zYV9wbG90cyA8LSBwbG90X2dyaWQocGxvdHNfZDNfYWRfc2NvcmVkX2FkW1sxXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfZDNfYWRfc2NvcmVkX2FkW1syXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfZDNfYWRfc2NvcmVkX2FkW1szXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQTEiLCAiQTIiLCAiQTMiKSwgbmNvbCA9IDMpCgpmaWd1cmU0LjNhX2xlZyA8LSBnZXRfbGVnZW5kKHBsb3RzX2QzX2FkX3Njb3JlZF9hZFtbMV1dICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX2ZpbGxfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjb2xvcnMwOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDkpKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV9jb2xvcl9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGNvbG9yczA5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gOSkpKQogIApmaWd1cmU0LjNhX3Bsb3RzX2xlZyA8LSBwbG90X2dyaWQoZmlndXJlNC4zYV9wbG90cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZ3VyZTQuM2FfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAwLjA1KSkKCmZpZ3VyZTQuM2FfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTdHVkeSAzOiBBZHVsdHMiLCBzaXplID0gMTYsIGZvbnRmYWNlID0gJ2JvbGQnLCB4ID0gMCwgaGp1c3QgPSAwKQoKZmlndXJlNC4zYV9wbG90c19sZWdfdGl0bGUgPC0gcGxvdF9ncmlkKGZpZ3VyZTQuM2FfdGl0bGUsIGZpZ3VyZTQuM2FfcGxvdHNfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygwLjEyLCAxKSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNiwgZmlnLmFzcCA9IDAuNH0KZmlndXJlNC4zYV9wbG90c19sZWdfdGl0bGUKYGBgCgojIyMjIEFuYWx5c2lzIG9mIGFzeW1tZXRyaWVzCgpYWAoKIyMjIENoaWxkcmVuICg3LTl5KQoKIyMjIyBTY2FsZSBjb25zdHJ1Y3Rpb24KCmBgYHtyfQpzY2FsZXNfZWZhX3dkbV9kM183OSA8LSBzY2FsZV9mdW4oZWZhX3dkbV9kM183OSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGZhY3Rvcl9uYW1lc19lZmFfd2RtX2QzXzc5KQpgYGAKCkZvbGxvd2luZyB0aGUgc3RlcHMgZGVzY3JpYmVkIGluICJHZW5lcmFsIGFuYWx5c2lzIHBsYW4sIiBhYm92ZSwgeWllbGRlZCBgciBmYWN0X25hbWVfZnVuKGZhY3Rvcl9uYW1lc19lZmFfd2RtX2QzXzc5KWAgc2NhbGVzIG9mIGByIHNjYWxlc19lZmFfd2RtX2QzXzc5ICU+JSBjb3VudChmYWN0b3IpICU+JSBzdW1tYXJpc2UobWVhbiA9IG1lYW4obikpICU+JSBzZWxlY3QobWVhbikgJT4lIGFzLm51bWVyaWMoKWAgaXRlbXMgZWFjaDsgc2VlIFRhYmxlIDQuMy4KCmBgYHtyfQpkM183OV9zY29yZWRfYWQgPC0gc2NvcmVfZnVuKGQzXzc5LCBzY2FsZXNfZWZhX3dkbV9kM19hZCkKZDNfNzlfc2NvcmVkXzc5IDwtIHNjb3JlX2Z1bihkM183OSwgc2NhbGVzX2VmYV93ZG1fZDNfNzkpCmBgYAoKIyMjIyBWaXN1YWxpemF0aW9uCgojIyMjIyBVc2luZyBhZHVsdHMnIHNjYWxlcwoKWFgKCmBgYHtyfQpwbG90c19kM183OV9zY29yZWRfYWQgPC0gcmVsdml6X2Z1bihkM183OV9zY29yZWRfYWQsIGNvbG9ycyA9IGNvbG9yczA5KQpgYGAKCmBgYHtyfQpmaWd1cmU0LjNiX3Bsb3RzIDwtIHBsb3RfZ3JpZChwbG90c19kM183OV9zY29yZWRfYWRbWzFdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kM183OV9zY29yZWRfYWRbWzJdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kM183OV9zY29yZWRfYWRbWzNdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJCMSIsICJCMiIsICJCMyIpLCBuY29sID0gMykKCmZpZ3VyZTQuM2JfbGVnIDwtIGdldF9sZWdlbmQocGxvdHNfZDNfNzlfc2NvcmVkX2FkW1sxXV0gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVfZmlsbF9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGNvbG9yczA5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gOSkpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX2NvbG9yX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gY29sb3JzMDksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSA5KSkpCiAgCmZpZ3VyZTQuM2JfcGxvdHNfbGVnIDwtIHBsb3RfZ3JpZChmaWd1cmU0LjNiX3Bsb3RzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlndXJlNC4zYl9sZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDAuMDUpKQoKZmlndXJlNC4zYl90aXRsZSA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoIlN0dWR5IDM6IENoaWxkcmVuLCA3LTl5IChzY29yZWQgdXNpbmcgYWR1bHRzJyBzY2FsZXMpIiwgc2l6ZSA9IDE2LCBmb250ZmFjZSA9ICdib2xkJywgeCA9IDAsIGhqdXN0ID0gMCkKCmZpZ3VyZTQuM2JfcGxvdHNfbGVnX3RpdGxlIDwtIHBsb3RfZ3JpZChmaWd1cmU0LjNiX3RpdGxlLCBmaWd1cmU0LjNiX3Bsb3RzX2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMC4xMiwgMSkpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDYsIGZpZy5hc3AgPSAwLjR9CmZpZ3VyZTQuM2JfcGxvdHNfbGVnX3RpdGxlCmBgYAoKIyMjIyMgVXNpbmcgY2hpbGRyZW4ncyBvd24gc2NhbGVzCgpYWAoKYGBge3J9CnBsb3RzX2QzXzc5X3Njb3JlZF83OSA8LSByZWx2aXpfZnVuKGQzXzc5X3Njb3JlZF83OSwgY29sb3JzID0gY29sb3JzMDkpCmBgYAoKYGBge3J9CmZpZ3VyZTQuM2NfcGxvdHMgPC0gcGxvdF9ncmlkKHBsb3RzX2QzXzc5X3Njb3JlZF83OVtbMV1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2QzXzc5X3Njb3JlZF83OVtbMl1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2QzXzc5X3Njb3JlZF83OVtbM11dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkExIiwgIkEyIiwgIkEzIiksIG5jb2wgPSAzKQoKZmlndXJlNC4zY19sZWcgPC0gZ2V0X2xlZ2VuZChwbG90c19kM183OV9zY29yZWRfNzlbWzFdXSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV9maWxsX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gY29sb3JzMDksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSA5KSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVfY29sb3JfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjb2xvcnMwOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDkpKSkKICAKZmlndXJlNC4zY19wbG90c19sZWcgPC0gcGxvdF9ncmlkKGZpZ3VyZTQuM2NfcGxvdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWd1cmU0LjNjX2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMC4wNSkpCgpmaWd1cmU0LjNjX3RpdGxlIDwtIGdnZHJhdygpICsgCiAgZHJhd19sYWJlbCgiU3R1ZHkgMzogQ2hpbGRyZW4sIDctOXkgKHNjb3JlZCB1c2luZyB0aGVpciBvd24gc2NhbGVzKSIsIHNpemUgPSAxNiwgZm9udGZhY2UgPSAnYm9sZCcsIHggPSAwLCBoanVzdCA9IDApCgpmaWd1cmU0LjNjX3Bsb3RzX2xlZ190aXRsZSA8LSBwbG90X2dyaWQoZmlndXJlNC4zY190aXRsZSwgZmlndXJlNC4zY19wbG90c19sZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDAuMTIsIDEpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA2LCBmaWcuYXNwID0gMC40fQpmaWd1cmU0LjNjX3Bsb3RzX2xlZ190aXRsZQpgYGAKCiMjIyMgQW5hbHlzaXMgb2YgYXN5bW1ldHJpZXMKClhYCgojIyMgQ2hpbGRyZW4gKDQtNnkpCgojIyMjIFNjYWxlIGNvbnN0cnVjdGlvbgoKIyMjIyMgVGhyZWUtZmFjdG9yIHNvbHV0aW9uCgpgYGB7cn0Kc2NhbGVzX2VmYV93ZG1fZDNfNDYgPC0gc2NhbGVfZnVuKGVmYV93ZG1fZDNfNDYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBmYWN0b3JfbmFtZXNfZWZhX3dkbV9kM180NikKYGBgCgpGb2xsb3dpbmcgdGhlIHN0ZXBzIGRlc2NyaWJlZCBpbiAiR2VuZXJhbCBhbmFseXNpcyBwbGFuLCIgYWJvdmUsIHlpZWxkZWQgYHIgZmFjdF9uYW1lX2Z1bihmYWN0b3JfbmFtZXNfZWZhX3dkbV9kM180NilgIHNjYWxlcyBvZiBgciBzY2FsZXNfZWZhX3dkbV9kM180NiAlPiUgY291bnQoZmFjdG9yKSAlPiUgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKG4pKSAlPiUgc2VsZWN0KG1lYW4pICU+JSBhcy5udW1lcmljKClgIGl0ZW1zIGVhY2g7IHNlZSBUYWJsZSA0LjMuCgojIyMjIyBUd28tZmFjdG9yIHNvbHV0aW9uCgpgYGB7cn0Kc2NhbGVzX2VmYV9wYXJfZDNfNDYgPC0gc2NhbGVfZnVuKGVmYV9wYXJfZDNfNDYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBmYWN0b3JfbmFtZXNfZWZhX3Bhcl9kM180NikKYGBgCgpGb2xsb3dpbmcgdGhlIHN0ZXBzIGRlc2NyaWJlZCBpbiAiR2VuZXJhbCBhbmFseXNpcyBwbGFuLCIgYWJvdmUsIHlpZWxkZWQgYHIgZmFjdF9uYW1lX2Z1bihmYWN0b3JfbmFtZXNfZWZhX3Bhcl9kM180NilgIHNjYWxlcyBvZiBgciBzY2FsZXNfZWZhX3Bhcl9kM180NiAlPiUgY291bnQoZmFjdG9yKSAlPiUgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKG4pKSAlPiUgc2VsZWN0KG1lYW4pICU+JSBhcy5udW1lcmljKClgIGl0ZW1zIGVhY2g7IHNlZSBUYWJsZSA0LjMuCgpgYGB7cn0KZDNfNDZfc2NvcmVkX2FkIDwtIHNjb3JlX2Z1bihkM180Niwgc2NhbGVzX2VmYV93ZG1fZDNfYWQpCmQzXzQ2X3Njb3JlZF80Nl93ZG0gPC0gc2NvcmVfZnVuKGQzXzQ2LCBzY2FsZXNfZWZhX3dkbV9kM180NikKZDNfNDZfc2NvcmVkXzQ2X3BhciA8LSBzY29yZV9mdW4oZDNfNDYsIHNjYWxlc19lZmFfcGFyX2QzXzQ2KQpgYGAKCiMjIyMgVmlzdWFsaXphdGlvbgoKIyMjIyMgVXNpbmcgYWR1bHRzJyBzY2FsZXMKClhYCgpgYGB7cn0KcGxvdHNfZDNfNDZfc2NvcmVkX2FkIDwtIHJlbHZpel9mdW4oZDNfNDZfc2NvcmVkX2FkLCBjb2xvcnMgPSBjb2xvcnMwOSkKYGBgCgpgYGB7cn0KZmlndXJlNC4zZF9wbG90cyA8LSBwbG90X2dyaWQocGxvdHNfZDNfNDZfc2NvcmVkX2FkW1sxXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfZDNfNDZfc2NvcmVkX2FkW1syXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfZDNfNDZfc2NvcmVkX2FkW1szXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQzEiLCAiQzIiLCAiQzMiKSwgbmNvbCA9IDMpCgpmaWd1cmU0LjNkX2xlZyA8LSBnZXRfbGVnZW5kKHBsb3RzX2QzXzQ2X3Njb3JlZF9hZFtbMV1dICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX2ZpbGxfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjb2xvcnMwOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDkpKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV9jb2xvcl9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGNvbG9yczA5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gOSkpKQogIApmaWd1cmU0LjNkX3Bsb3RzX2xlZyA8LSBwbG90X2dyaWQoZmlndXJlNC4zZF9wbG90cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZ3VyZTQuM2RfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAwLjA1KSkKCmZpZ3VyZTQuM2RfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTdHVkeSAzOiBDaGlsZHJlbiwgNC02eSAoc2NvcmVkIHVzaW5nIGFkdWx0cycgc2NhbGVzKSIsIHNpemUgPSAxNiwgZm9udGZhY2UgPSAnYm9sZCcsIHggPSAwLCBoanVzdCA9IDApCgpmaWd1cmU0LjNkX3Bsb3RzX2xlZ190aXRsZSA8LSBwbG90X2dyaWQoZmlndXJlNC4zZF90aXRsZSwgZmlndXJlNC4zZF9wbG90c19sZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDAuMTIsIDEpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA2LCBmaWcuYXNwID0gMC40fQpmaWd1cmU0LjNkX3Bsb3RzX2xlZ190aXRsZQpgYGAKClhYCgojIyMjIyBVc2luZyBjaGlsZHJlbidzIG93biBzY2FsZXMgKHRocmVlLWZhY3RvciBzb2x1dGlvbikKClhYCgpgYGB7cn0KcGxvdHNfZDNfNDZfc2NvcmVkXzQ2X3dkbSA8LSByZWx2aXpfZnVuKGQzXzQ2X3Njb3JlZF80Nl93ZG0sIGNvbG9ycyA9IGNvbG9yczA5KQpgYGAKCmBgYHtyfQpmaWd1cmU0LjNlX3Bsb3RzIDwtIHBsb3RfZ3JpZChwbG90c19kM180Nl9zY29yZWRfNDZfd2RtW1sxXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfZDNfNDZfc2NvcmVkXzQ2X3dkbVtbMl1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2QzXzQ2X3Njb3JlZF80Nl93ZG1bWzNdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJCMSIsICJCMiIsICJCMyIpLCBuY29sID0gMykKCmZpZ3VyZTQuM2VfbGVnIDwtIGdldF9sZWdlbmQocGxvdHNfZDNfNDZfc2NvcmVkXzQ2X3dkbVtbMV1dICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX2ZpbGxfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjb2xvcnMwOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDkpKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV9jb2xvcl9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGNvbG9yczA5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gOSkpKQogIApmaWd1cmU0LjNlX3Bsb3RzX2xlZyA8LSBwbG90X2dyaWQoZmlndXJlNC4zZV9wbG90cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZ3VyZTQuM2VfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAwLjA1KSkKCmZpZ3VyZTQuM2VfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTdHVkeSAzOiBDaGlsZHJlbiwgNC02eSAoc2NvcmVkIHVzaW5nIHRoZWlyIG93biBzY2FsZXMsIDMtZmFjdG9yIHNvbHV0aW9uKSIsIHNpemUgPSAxNiwgZm9udGZhY2UgPSAnYm9sZCcsIHggPSAwLCBoanVzdCA9IDApCgpmaWd1cmU0LjNlX3Bsb3RzX2xlZ190aXRsZSA8LSBwbG90X2dyaWQoZmlndXJlNC4zZV90aXRsZSwgZmlndXJlNC4zZV9wbG90c19sZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDAuMTIsIDEpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA2LCBmaWcuYXNwID0gMC40fQpmaWd1cmU0LjNlX3Bsb3RzX2xlZ190aXRsZQpgYGAKClhYCgojIyMjIyBVc2luZyBjaGlsZHJlbidzIG93biBzY2FsZXMgKHRocmVlLWZhY3RvciBzb2x1dGlvbikKClhYCgpgYGB7cn0KcGxvdHNfZDNfNDZfc2NvcmVkXzQ2X3BhciA8LSByZWx2aXpfZnVuKGQzXzQ2X3Njb3JlZF80Nl9wYXIsIGNvbG9ycyA9IGNvbG9yczA5KQpgYGAKCmBgYHtyfQpmaWd1cmU0LjNmX3Bsb3RzIDwtIHBsb3RfZ3JpZChwbG90c19kM180Nl9zY29yZWRfNDZfcGFyW1sxXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQzEiKSwgbmNvbCA9IDMpCgpmaWd1cmU0LjNmX2xlZyA8LSBnZXRfbGVnZW5kKHBsb3RzX2QzXzQ2X3Njb3JlZF80Nl9wYXJbWzFdXSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV9maWxsX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gY29sb3JzMDksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSA5KSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVfY29sb3JfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjb2xvcnMwOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDkpKSkKICAKZmlndXJlNC4zZl9wbG90c19sZWcgPC0gcGxvdF9ncmlkKGZpZ3VyZTQuM2ZfcGxvdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWd1cmU0LjNmX2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMC4wNSkpCgpmaWd1cmU0LjNmX3RpdGxlIDwtIGdnZHJhdygpICsgCiAgZHJhd19sYWJlbCgiU3R1ZHkgMzogQ2hpbGRyZW4sIDQtNnkgKHNjb3JlZCB1c2luZyB0aGVpciBvd24gc2NhbGVzLCAyLWZhY3RvciBzb2x1dGlvbikiLCBzaXplID0gMTYsIGZvbnRmYWNlID0gJ2JvbGQnLCB4ID0gMCwgaGp1c3QgPSAwKQoKZmlndXJlNC4zZl9wbG90c19sZWdfdGl0bGUgPC0gcGxvdF9ncmlkKGZpZ3VyZTQuM2ZfdGl0bGUsIGZpZ3VyZTQuM2ZfcGxvdHNfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygwLjEyLCAxKSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNiwgZmlnLmFzcCA9IDAuNH0KZmlndXJlNC4zZl9wbG90c19sZWdfdGl0bGUKYGBgCgpYWAoKIyMjIyBBbmFseXNpcyBvZiBhc3ltbWV0cmllcwoKWFgKCiMjIERpc2N1c3Npb24KClhYCgpgYGB7cn0Kc2NhbGVzX3N0dWR5MyA8LSBiaW5kX3Jvd3Moc2NhbGVzX2VmYV93ZG1fZDNfYWQgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShzdHVkeSA9ICJBZHVsdHMiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVzX2VmYV93ZG1fZDNfNzkgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShzdHVkeSA9ICJPbGRlciBjaGlsZHJlbiwgNy05eSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZXNfZWZhX3dkbV9kM180NiAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoc3R1ZHkgPSAiWW91bmdlciBjaGlsZHJlbiwgNC02eSAoMy1mYWN0b3Igc29sdXRpb24pIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlc19lZmFfcGFyX2QzXzQ2ICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShzdHVkeSA9ICJZb3VuZ2VyIGNoaWxkcmVuLCA0LTZ5ICgyLWZhY3RvciBzb2x1dGlvbikiKSkgJT4lCiAgc2VsZWN0KC1jKGxvYWRpbmcsIG9yZGVyKSkgJT4lCiAgZGlzdGluY3QoKSAlPiUKICBtdXRhdGUoc3R1ZHkgPSBmYWN0b3Ioc3R1ZHksCiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIkFkdWx0cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9sZGVyIGNoaWxkcmVuLCA3LTl5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWW91bmdlciBjaGlsZHJlbiwgNC02eSAoMy1mYWN0b3Igc29sdXRpb24pIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWW91bmdlciBjaGlsZHJlbiwgNC02eSAoMi1mYWN0b3Igc29sdXRpb24pIikpKSAlPiUKICBzcHJlYWQoc3R1ZHksIGZhY3RvcikgJT4lCiAgbXV0YXRlKHVyX2ZhY3RvciA9IGlmZWxzZSghaXMubmEoYEFkdWx0c2ApLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBBZHVsdHNgLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSghaXMubmEoYE9sZGVyIGNoaWxkcmVuLCA3LTl5YCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBPbGRlciBjaGlsZHJlbiwgNy05eWAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGlzLm5hKGBZb3VuZ2VyIGNoaWxkcmVuLCA0LTZ5ICgzLWZhY3RvciBzb2x1dGlvbilgKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBZb3VuZ2VyIGNoaWxkcmVuLCA0LTZ5ICgzLWZhY3RvciBzb2x1dGlvbilgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgWW91bmdlciBjaGlsZHJlbiwgNC02eSAoMi1mYWN0b3Igc29sdXRpb24pYCkpKSkgJT4lCiAgbGVmdF9qb2luKHNjYWxlc19lZmFfd2RtX2QzX2FkICU+JSAKICAgICAgICAgICAgICBzZWxlY3QoY2FwYWNpdHksIG9yZGVyKSAlPiUgcmVuYW1lKG9yZGVyX2FkID0gb3JkZXIpKSAlPiUKICBsZWZ0X2pvaW4oc2NhbGVzX2VmYV93ZG1fZDNfNzkgJT4lIAogICAgICAgICAgICAgIHNlbGVjdChjYXBhY2l0eSwgb3JkZXIpICU+JSByZW5hbWUob3JkZXJfNzkgPSBvcmRlcikpICU+JQogIGFycmFuZ2UodXJfZmFjdG9yLCBvcmRlcl9hZCwgb3JkZXJfNzkpICU+JQogIHNlbGVjdCgtYyh1cl9mYWN0b3IsIHN0YXJ0c193aXRoKCJvcmRlciIpKSkKYGBgCgpgYGB7cn0KdGFibGU0LjMgPC0gc2NhbGVzX3N0dWR5MyAlPiUKICBtdXRhdGVfYWxsKGFzLmNoYXJhY3RlcikgJT4lCiAgIyBkZWFsIHdpdGggeW91bmdlciBjaGlsZHJlbiwgMi1mYWN0b3Igc29sdXRpb24KICBtdXRhdGUodGVtcDEgPSBgWW91bmdlciBjaGlsZHJlbiwgNC02eSAoMi1mYWN0b3Igc29sdXRpb24pYCwKICAgICAgICAgdGVtcDIgPSBnc3ViKCJcXCoiLCAiIiwgdGVtcDEpLAogICAgICAgICB0ZW1wMyA9IGNhc2Vfd2hlbigKICAgICAgICAgICB0ZW1wMiA9PSBgQWR1bHRzYCB8IAogICAgICAgICAgICAgdGVtcDIgPT0gYE9sZGVyIGNoaWxkcmVuLCA3LTl5YCB+ICLinJMiLAogICAgICAgICAgIGlzLm5hKHRlbXAyKSB+ICIiLAogICAgICAgICAgIFRSVUUgfiB0ZW1wMSkpICU+JQogIG11dGF0ZShgWW91bmdlciBjaGlsZHJlbiwgNC02eSAoMi1mYWN0b3Igc29sdXRpb24pYCA9IHRlbXAzKSAlPiUKICBzZWxlY3QoLXN0YXJ0c193aXRoKCJ0ZW1wIikpICU+JQogICMgZGVhbCB3aXRoIHlvdW5nZXIgY2hpbGRyZW4sIDMtZmFjdG9yIHNvbHV0aW9uCiAgbXV0YXRlKHRlbXAxID0gYFlvdW5nZXIgY2hpbGRyZW4sIDQtNnkgKDMtZmFjdG9yIHNvbHV0aW9uKWAsCiAgICAgICAgIHRlbXAyID0gZ3N1YigiXFwqIiwgIiIsIHRlbXAxKSwKICAgICAgICAgdGVtcDMgPSBjYXNlX3doZW4oCiAgICAgICAgICAgdGVtcDIgPT0gYEFkdWx0c2AgfCAKICAgICAgICAgICAgIHRlbXAyID09IGBPbGRlciBjaGlsZHJlbiwgNy05eWAgfAogICAgICAgICAgICAgKGlzLm5hKGBBZHVsdHNgKSAmIGlzLm5hKGBPbGRlciBjaGlsZHJlbiwgNy05eWApKSB+ICLinJMiLAogICAgICAgICAgIGlzLm5hKHRlbXAyKSB+ICIiLAogICAgICAgICAgIFRSVUUgfiB0ZW1wMSkpICU+JQogIG11dGF0ZShgWW91bmdlciBjaGlsZHJlbiwgNC02eSAoMy1mYWN0b3Igc29sdXRpb24pYCA9IHRlbXAzKSAlPiUKICBzZWxlY3QoLXN0YXJ0c193aXRoKCJ0ZW1wIikpICU+JQogIG11dGF0ZV9hdCh2YXJzKGBBZHVsdHNgLCBgT2xkZXIgY2hpbGRyZW4sIDctOXlgKSwKICAgICAgICAgICAgZnVucyhpZmVsc2UoaXMubmEoLiksICIiLCAi4pyTIikpKSAlPiUKICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgiWW91bmdlciIpKSwKICAgICAgICAgICAgZnVucyhpZmVsc2UoaXMubmEoLiksICIiLCAuKSkpICU+JQogIHJlbmFtZShDYXBhY2l0eSA9IGNhcGFjaXR5LAogICAgICAgICBgMy1mYWN0b3Igc29sdXRpb25gID0gYFlvdW5nZXIgY2hpbGRyZW4sIDQtNnkgKDMtZmFjdG9yIHNvbHV0aW9uKWAsCiAgICAgICAgIGAyLWZhY3RvciBzb2x1dGlvbmAgPSBgWW91bmdlciBjaGlsZHJlbiwgNC02eSAoMi1mYWN0b3Igc29sdXRpb24pYCkgJT4lCiAga2FibGUoZm9ybWF0ID0gImh0bWwiLAogICAgICAgIGNhcHRpb24gPSAiVGFibGUgNC4zOiBTY2FsZXMgZm9yIGVhY2ggb2YgdGhlIGNvbmNlcHR1YWwgdW5pdHMgKGZhY3RvcnMpIGlkZW50aWZpZWQgYnkgRUZBIGZvciBVUyBBZHVsdHMsIG9sZGVyIGNoaWxkcmVuLCBhbmQgeW91bmdlciBjaGlsZHJlbiBpbiBTdHVkeSAzIChzZWUgQ2hhcHRlciBJSUkpLiBGb3IgeW91bmdlciBjaGlsZHJlbiwgdGhpcyBpbmNsdWRlcyBzY2FsZXMgZm9yIGJvdGggdGhyZWUtIGFuZCB0d28tZmFjdG9yIEVGQSBzb2x1dGlvbnMuIEEgY2hlY2ttYXJrIGluZGljYXRlcyB0aGF0IGEgbWVudGFsIGNhcGFjaXR5IHdhcyBpbmNsdWRlZCBpbiBhIHNjYWxlIGZvciBhIHBhcnRpY3VsYXIgc2FtcGxlLiBUaGUgY29uY2VwdHVhbCB1bml0cyBvZiB5b3VuZ2VyIGNoaWxkcmVuIGRpZmZlcmVkIHN1YnN0YW50aWFsbHkgZnJvbSB0aG9zZSBvZiBvbGRlciBjaGlsZHJlbiBhbmQgYWR1bHRzLCBzdWNoIHRoYXQgc29tZSBtZW50YWwgY2FwYWNpdGllcyB3ZXJlIGluY2x1ZGVkIGluIGRpZmZlcmVudCBzY2FsZXMgYWNyb3NzIGFnZSBncm91cHMgKGUuZy4sIGZlZWwgc2NhcmVkIHdhcyBwYXJ0IG9mIHRoZSBCT0RZIHNjYWxlIGZvciBvbGRlciBjaGlsZHJlbiBhbmQgYWR1bHRzLCBidXQgcGFydCBvZiB0aGUgSEVBUlQqIHNjYWxlIGZvciB5b3VuZ2VyIGNoaWxkcmVuKS4gSW4gdGhlc2UgY2FzZXMsIHRoZSBuYW1lIG9mIHRoZSBzY2FsZSBpcyBwcm92aWRlZCAocmF0aGVyIHRoYW4gYSBjaGVja21hcmspLiIpICU+JQogIGthYmxlX3N0eWxpbmcoKSAlPiUKICBncm91cF9yb3dzKCJCT0RZIHNjYWxlIiwgMSwgNykgJT4lCiAgZ3JvdXBfcm93cygiSEVBUlQgc2NhbGUiLCA4LCAxNCkgJT4lCiAgZ3JvdXBfcm93cygiTUlORCBzY2FsZSIsIDE1LCAyMCkgJT4lCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIiA9IDMsCiAgICAgICAgICAgICAgICAgICAgICJZb3VuZ2VyIGNoaWxkcmVuLCA0LTZ5IiA9IDIpKQpgYGAKCmBgYHtyIHRhYmxlNC4zLCBpbmNsdWRlID0gVH0KdGFibGU0LjMKYGBgCgpgYGB7cn0KcGxvdHNfYWdlZ3BfZDNfc2NvcmVkX2FkIDwtIHJlbHZpel9hZ2VncF9mdW4oCiAgZF9zY29yZWQgPSBkM19hZF9zY29yZWRfYWQgJT4lIAogICAgZnVsbF9qb2luKGQzXzc5X3Njb3JlZF9hZCkgJT4lIAogICAgZnVsbF9qb2luKGQzXzQ2X3Njb3JlZF9hZCksIAogIGFnZV9ncm91cHMgPSBjKCJjaGlsZHJlbjQ2IiwgImNoaWxkcmVuNzkiLCAiYWR1bHRzIiksCiAgYWdlX2dyb3VwX2xhYmVscyA9IGMoIkNoaWxkcmVuLCAoNC02eSkiLCAiQ2hpbGRyZW4gKDctOXkpIiwgIkFkdWx0cyIpLAogIGNvbG9ycyA9IGNvbG9yczA5KQpgYGAKCmBgYHtyfQpmaWd1cmU0LjNhbGxfcGxvdHMgPC0gcGxvdF9ncmlkKHBsb3RzX2FnZWdwX2QzX3Njb3JlZF9hZFtbMV1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2FnZWdwX2QzX3Njb3JlZF9hZFtbMl1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2FnZWdwX2QzX3Njb3JlZF9hZFtbM11dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkQxIiwgIkQyIiwgIkQzIiksIG5jb2wgPSAzKQoKZmlndXJlNC4zYWxsX2xlZyA8LSBnZXRfbGVnZW5kKHBsb3RzX2FnZWdwX2QzX3Njb3JlZF9hZFtbMV1dICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX2NvbG9yX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gY29sb3JzMDksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEudHJhbnNsYXRlID0gRiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDkpKSkKICAKZmlndXJlNC4zYWxsX3Bsb3RzX2xlZyA8LSBwbG90X2dyaWQoZmlndXJlNC4zYWxsX3Bsb3RzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlndXJlNC4zYWxsX2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMC4wNSkpCgpmaWd1cmU0LjNhbGxfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJUcmFja2luZyBkZXZlbG9wbWVudCBiZXR3ZWVuIDQtOXkgYW5kIGFkdWx0aG9vZCAoc2NvcmVkIHVzaW5nIGFkdWx0cycgc2NhbGVzKSIsIAogICAgICAgICAgICAgc2l6ZSA9IDE2LCBmb250ZmFjZSA9ICdib2xkJywgeCA9IDAsIGhqdXN0ID0gMCkKCmZpZ3VyZTQuM2FsbF9wbG90c19sZWdfdGl0bGUgPC0gcGxvdF9ncmlkKGZpZ3VyZTQuM2FsbF90aXRsZSwgZmlndXJlNC4zYWxsX3Bsb3RzX2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMC4xMiwgMSkpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDYsIGZpZy5hc3AgPSAwLjR9CmZpZ3VyZTQuM2FsbF9wbG90c19sZWdfdGl0bGUKYGBgCgpgYGB7cn0KZmlndXJlNC40IDwtIHBsb3RfZ3JpZChmaWd1cmU0LjNhX3Bsb3RzX2xlZ190aXRsZSwgZmlndXJlNC4zYl9wbG90c19sZWdfdGl0bGUsCiAgICAgICAgICAgICAgICAgICAgICAgZmlndXJlNC4zZF9wbG90c19sZWdfdGl0bGUsIGZpZ3VyZTQuM2FsbF9wbG90c19sZWdfdGl0bGUsCiAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEpCgpmaWd1cmU0LjRfY2FwIDwtIGFkZF9zdWIoZmlndXJlNC40LCBzdHJfd3JhcCgiRmlndXJlIDQuNDogUmVsYXRpb25zaGlwcyBhbW9uZyBVUyBhZHVsdHMnLCBvbGRlciBjaGlsZHJlbidzLCBhbmQgeW91bmdlciBjaGlsZHJlbidzIGF0dHJpYnV0aW9ucyBvZiBjb25jZXB0dWFsIHVuaXRzIGluIFN0dWR5IDMsIHNjb3JlZCB1c2luZyBhZHVsdHMnIEJPRFksIEhFQVJULCBhbmQgTUlORCBzY2FsZXMgKHNlZSBUYWJsZSA0LjMpLiAoQSkgQWR1bHRzLiAoQikgT2xkZXIgY2hpbGRyZW4gKDctOXkgb2YgYWdlKS4gKEMpIFlvdW5nZXIgY2hpbGRyZW4gKDQtNnkgb2YgYWdlKS4gKEQpIEEgdmlzdWFsaXphdGlvbiBvZiBkZXZlbG9wbWVudCBiZXR3ZWVuIDQtOXkgYW5kIGFkdWx0aG9vZCwgdXNpbmcgbWVhbiBzY29yZXMgYnkgY2hhcmFjdGVyIGFuZCBhZ2UgZ3JvdXAuIFBsb3RzIGFyZSBvcmdhbml6ZWQgYnkgc2FtcGxlIChyb3dzKSBhbmQgYnkgcGFpciBvZiBjb25jZXB0dWFsIHVuaXRzIChjb2x1bW5zKS4gRm9yIGVhY2ggY29uY2VwdHVhbCB1bml0LCBzY29yZXMgY291bGQgcmFuZ2UgZnJvbSAwLTEuIEluIHBhbmVscyBBLUMsIGluZGl2aWR1YWwgcGFydGljaXBhbnRzIGFyZSBwbG90dGVkIGFzIHNtYWxsLCB0cmFuc2x1Y2VudCBjaXJjbGVzLCBhbmQgbWVhbiBzY29yZXMgYnkgY2hhcmFjdGVyIGFyZSBwbG90dGVkIGFzIGxhcmdlciwgc29saWQgZGlhbW9uZHMuIEVycm9yIGJhcnMgYXJlIDk1JSBib290c3RyYXBwZWQgY29uZmlkZW5jZSBpbnRlcnZhbHMuIFRoZSBkb3R0ZWQgbGluZSBjb3JyZXNwb25kcyB0byBlcXVhbCBlbmRvcnNlbWVudHMgb2YgdGhlIHR3byBjb25jZXB0dWFsIHVuaXRzIHBsb3R0ZWQuIiwgMTEwKSwgeCA9IDAsIGhqdXN0ID0gMCkKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IFQsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAxLjg1fQpnZ2RyYXcoZmlndXJlNC40X2NhcCkKYGBgCgpgYGB7cn0KZmlndXJlNC41IDwtIHBsb3RfZ3JpZChmaWd1cmU0LjNjX3Bsb3RzX2xlZ190aXRsZSwgZmlndXJlNC4zZV9wbG90c19sZWdfdGl0bGUsCiAgICAgICAgICAgICAgICAgICAgICAgZmlndXJlNC4zZl9wbG90c19sZWdfdGl0bGUsCiAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEpCgpmaWd1cmU0LjVfY2FwIDwtIGFkZF9zdWIoZmlndXJlNC41LCBzdHJfd3JhcCgiRmlndXJlIDQuNTogUmVsYXRpb25zaGlwcyBhbW9uZyBvbGRlciBhbmQgeW91bmdlciBjaGlsZHJlbidzIGF0dHJpYnV0aW9ucyBvZiBjb25jZXB0dWFsIHVuaXRzIGluIFN0dWR5IDMsIHNjb3JlZCB1c2luZyB0aGVpciBvd24gc2NhbGVzIChzZWUgVGFibGUgNC4zKS4gRm9yIHlvdW5nZXIgY2hpbGRyZW4gKDQtNnkgb2YgYWdlKSwgdHdvIHNldHMgb2Ygc2NvcmVzIGFyZSBwcmVzZW50ZWQ6IHVzaW5nIGEgdGhyZWUtZmFjdG9yIEVGQSBzb2x1dGlvbiAoQjEtQjMpIGFuZCB1c2luZyBhIHR3by1mYWN0b3IgRUZBIHNvbHV0aW9uIChDMS1DMykuIFBsb3RzIGFyZSBvcmdhbml6ZWQgYnkgc2FtcGxlIGFuZCBzY2FsZSB1c2VkIChyb3dzKSBhbmQgYnkgcGFpciBvZiBjb25jZXB0dWFsIHVuaXRzIChjb2x1bW5zKS4gRm9yIGVhY2ggY29uY2VwdHVhbCB1bml0LCBzY29yZXMgY291bGQgcmFuZ2UgZnJvbSAwLTEuIEluZGl2aWR1YWwgcGFydGljaXBhbnRzIGFyZSBwbG90dGVkIGFzIHNtYWxsLCB0cmFuc2x1Y2VudCBjaXJjbGVzLCBhbmQgbWVhbiBzY29yZXMgYnkgY2hhcmFjdGVyIGFyZSBwbG90dGVkIGFzIGxhcmdlciwgc29saWQgZGlhbW9uZHMuIEVycm9yIGJhcnMgYXJlIDk1JSBib290c3RyYXBwZWQgY29uZmlkZW5jZSBpbnRlcnZhbHMuIFRoZSBkb3R0ZWQgbGluZSBjb3JyZXNwb25kcyB0byBlcXVhbCBlbmRvcnNlbWVudHMgb2YgdGhlIHR3byBjb25jZXB0dWFsIHVuaXRzIHBsb3R0ZWQuIiwgMTEwKSwgeCA9IDAsIGhqdXN0ID0gMCkKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IFQsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAxLjM1fQpnZ2RyYXcoZmlndXJlNC41X2NhcCkKYGBgCgoKIyBTdHVkeSA0OiBBIGZvY3VzIG9uIGVhcmx5IGNoaWxkaG9vZCAoNC01eSkKCkluIFN0dWR5IDQsIGByIG5yb3coZDRfYWRfd2lkZSkvMmAgVVMgYWR1bHRzIGFuZCBgciBucm93KGQ0XzQ2X3dpZGUpLzJgIFVTIGNoaWxkcmVuIGJldHdlZW4gdGhlIGFnZXMgb2YgYHIgc3VtbWFyeShkNF80NiRhZ2UpWyJNaW4uIl0gJT4lIHJvdW5kKDIpYC1gciBzdW1tYXJ5KGQ0XzQ2JGFnZSlbIk1heC4iXSAlPiUgcm91bmQoMilgIHllYXJzIChtZWRpYW46IGByIHN1bW1hcnkoZDRfNDYkYWdlKVsiTWVkaWFuIl0gJT4lIHJvdW5kKDIpYHkpIGVhY2ggYXNzZXNzZWQgdHdvIHRhcmdldCBjaGFyYWN0ZXJzIG9uIDE4IG1lbnRhbCBjYXBhY2l0aWVzLiBUbyBtYWtlIHRoZSBzdHVkeSBhcHByb3ByaWF0ZSBmb3IgY2hpbGRyZW4gaW4gdGhpcyBhZ2UgcmFuZ2UsIHRoaXMgc3R1ZHkgZW1wbG95ZWQgYSBuZXcgc2V0IG9mIDE4IG1lbnRhbCBjYXBhY2l0aWVzIChzb21lIGJ1dCBub3QgYWxsIG9mIHdoaWNoIHdlcmUgdXNlZCBpbiBTdHVkaWVzIDEtMykuIEluIGFkZGl0aW9uLCBwYXJ0aWNpcGFudHMgd2VyZSBwcmVzZW50ZWQgd2l0aCBhIG1vcmUgY2hpbGQtZnJpZW5kbHkgdmlzdWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSAzLXBvaW50IHJlc3BvbnNlIHNjYWxlICgibm8sIiBjb2RlZCBhcyAwOyAia2luZGEsIiBjb2RlZCBhcyAwLjUsICJ5ZXMsIiBjb2RlZCBhcyAxKS4gVGhpcyBzdHVkeSBlbXBsb3llZCB0aGUgImVkZ2UgY2FzZSIgdmFyaWFudCBvZiB0aGUgZ2VuZXJhbCBhcHByb2FjaCwgd2l0aCBwYXJ0aWNpcGFudHMgYXNzZXNzaW5nIGJvdGggYSBiZWV0bGUgb3IgYSByb2JvdCBpbiBzZXF1ZW5jZSAod2l0aCBvcmRlciBjb3VudGVyYmFsYW5jZWQgYWNyb3NzIHBhcnRpY2lwYW50cykuIChTZWUgQ2hhcHRlciBJSSBmb3IgZGV0YWlsZWQgbWV0aG9kcy4pCgojIyBTcGVjaWFsIG5vdGVzIG9uIGRhdGEgcHJvY2Vzc2luZyBhbmQgYW5hbHlzaXMKCiMjIFJlc3VsdHMKCiMjIyBBZHVsdHMKCiMjIyMgU2NhbGUgY29uc3RydWN0aW9uCgpgYGB7cn0Kc2NhbGVzX2VmYV93ZG1fZDRfYWQgPC0gc2NhbGVfZnVuKGVmYV93ZG1fZDRfYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBmYWN0b3JfbmFtZXNfZWZhX3dkbV9kNF9hZCkKYGBgCgpGb2xsb3dpbmcgdGhlIHN0ZXBzIGRlc2NyaWJlZCBpbiAiR2VuZXJhbCBhbmFseXNpcyBwbGFuLCIgYWJvdmUsIHlpZWxkZWQgYHIgZmFjdF9uYW1lX2Z1bihmYWN0b3JfbmFtZXNfZWZhX3dkbV9kNF9hZClgIHNjYWxlcyBvZiBgciBzY2FsZXNfZWZhX3dkbV9kNF9hZCAlPiUgY291bnQoZmFjdG9yKSAlPiUgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKG4pKSAlPiUgc2VsZWN0KG1lYW4pICU+JSBhcy5udW1lcmljKClgIGl0ZW1zIGVhY2g7IHNlZSBUYWJsZSA0LjQuCgpgYGB7cn0KZDRfYWRfc2NvcmVkX2FkIDwtIHNjb3JlX2Z1bihkNF9hZCwgc2NhbGVzX2VmYV93ZG1fZDRfYWQpCmBgYAoKIyMjIyBWaXN1YWxpemF0aW9uCgpYWAoKYGBge3J9CnBsb3RzX2Q0X2FkX3Njb3JlZF9hZCA8LSByZWx2aXpfZnVuKGQ0X2FkX3Njb3JlZF9hZCwgY29sb3JzID0gY29sb3JzMDIpCmBgYAoKYGBge3J9CmZpZ3VyZTQuNWFfcGxvdHMgPC0gcGxvdF9ncmlkKHBsb3RzX2Q0X2FkX3Njb3JlZF9hZFtbMV1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2Q0X2FkX3Njb3JlZF9hZFtbMl1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2Q0X2FkX3Njb3JlZF9hZFtbM11dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkExIiwgIkEyIiwgIkEzIiksIG5jb2wgPSAzKQoKZmlndXJlNC41YV9sZWcgPC0gZ2V0X2xlZ2VuZChwbG90c19kNF9hZF9zY29yZWRfYWRbWzFdXSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV9maWxsX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gY29sb3JzMDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSA5KSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVfY29sb3JfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjb2xvcnMwMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDkpKSkKICAKZmlndXJlNC41YV9wbG90c19sZWcgPC0gcGxvdF9ncmlkKGZpZ3VyZTQuNWFfcGxvdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWd1cmU0LjVhX2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMC4wNSkpCgpmaWd1cmU0LjVhX3RpdGxlIDwtIGdnZHJhdygpICsgCiAgZHJhd19sYWJlbCgiU3R1ZHkgNDogQWR1bHRzIiwgc2l6ZSA9IDE2LCBmb250ZmFjZSA9ICdib2xkJywgeCA9IDAsIGhqdXN0ID0gMCkKCmZpZ3VyZTQuNWFfcGxvdHNfbGVnX3RpdGxlIDwtIHBsb3RfZ3JpZChmaWd1cmU0LjVhX3RpdGxlLCBmaWd1cmU0LjVhX3Bsb3RzX2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMC4xMiwgMSkpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDYsIGZpZy5hc3AgPSAwLjR9CmZpZ3VyZTQuNWFfcGxvdHNfbGVnX3RpdGxlCmBgYAoKIyMjIyBBbmFseXNpcyBvZiBhc3ltbWV0cmllcwoKWFgKCiMjIyBDaGlsZHJlbiAoNC01eSkKCiMjIyMgU2NhbGUgY29uc3RydWN0aW9uCgojIyMjIyBUaHJlZS1mYWN0b3Igc29sdXRpb24KCmBgYHtyfQpzY2FsZXNfZWZhX3Bhcl9kNF80NiA8LSBzY2FsZV9mdW4oZWZhX3Bhcl9kNF80NiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGZhY3Rvcl9uYW1lc19lZmFfcGFyX2Q0XzQ2KQpgYGAKCkZvbGxvd2luZyB0aGUgc3RlcHMgZGVzY3JpYmVkIGluICJHZW5lcmFsIGFuYWx5c2lzIHBsYW4sIiBhYm92ZSwgeWllbGRlZCBgciBmYWN0X25hbWVfZnVuKGZhY3Rvcl9uYW1lc19lZmFfcGFyX2Q0XzQ2KWAgc2NhbGVzIG9mIGByIHNjYWxlc19lZmFfcGFyX2Q0XzQ2ICU+JSBjb3VudChmYWN0b3IpICU+JSBzdW1tYXJpc2UobWVhbiA9IG1lYW4obikpICU+JSBzZWxlY3QobWVhbikgJT4lIGFzLm51bWVyaWMoKWAgaXRlbXMgZWFjaDsgc2VlIFRhYmxlIDQuNS4KCiMjIyMjIEZvdXItZmFjdG9yIHNvbHV0aW9uCgpgYGB7cn0Kc2NhbGVzX2VmYV93ZG1fZDRfNDYgPC0gc2NhbGVfZnVuKGVmYV93ZG1fZDRfNDYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBmYWN0b3JfbmFtZXNfZWZhX3dkbV9kNF80NikKYGBgCgpGb2xsb3dpbmcgdGhlIHN0ZXBzIGRlc2NyaWJlZCBpbiAiR2VuZXJhbCBhbmFseXNpcyBwbGFuLCIgYWJvdmUsIHlpZWxkZWQgYHIgZmFjdF9uYW1lX2Z1bihmYWN0b3JfbmFtZXNfZWZhX3dkbV9kNF80NilgIHNjYWxlcyBvZiBgciBzY2FsZXNfZWZhX3dkbV9kNF80NiAlPiUgY291bnQoZmFjdG9yKSAlPiUgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKG4pKSAlPiUgc2VsZWN0KG1lYW4pICU+JSBhcy5udW1lcmljKClgIGl0ZW1zIGVhY2g7IHNlZSBUYWJsZSA0LjUuCgpgYGB7cn0KZDRfNDZfc2NvcmVkX2FkIDwtIHNjb3JlX2Z1bihkNF80Niwgc2NhbGVzX2VmYV93ZG1fZDRfYWQpCmQ0XzQ2X3Njb3JlZF80Nl9wYXIgPC0gc2NvcmVfZnVuKGQ0XzQ2LCBzY2FsZXNfZWZhX3Bhcl9kNF80NikKZDRfNDZfc2NvcmVkXzQ2X3dkbSA8LSBzY29yZV9mdW4oZDRfNDYsIHNjYWxlc19lZmFfd2RtX2Q0XzQ2KQpgYGAKCiMjIyMgVmlzdWFsaXphdGlvbgoKIyMjIyMgVXNpbmcgYWR1bHRzJyBzY2FsZXMKClhYCgpgYGB7cn0KcGxvdHNfZDRfNDZfc2NvcmVkX2FkIDwtIHJlbHZpel9mdW4oZDRfNDZfc2NvcmVkX2FkLCBjb2xvcnMgPSBjb2xvcnMwMikKYGBgCgpgYGB7cn0KZmlndXJlNC41Yl9wbG90cyA8LSBwbG90X2dyaWQocGxvdHNfZDRfNDZfc2NvcmVkX2FkW1sxXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfZDRfNDZfc2NvcmVkX2FkW1syXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfZDRfNDZfc2NvcmVkX2FkW1szXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQjEiLCAiQjIiLCAiQjMiKSwgbmNvbCA9IDMpCgpmaWd1cmU0LjViX2xlZyA8LSBnZXRfbGVnZW5kKHBsb3RzX2Q0XzQ2X3Njb3JlZF9hZFtbMV1dICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX2ZpbGxfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjb2xvcnMwMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDkpKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV9jb2xvcl9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGNvbG9yczAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gOSkpKQogIApmaWd1cmU0LjViX3Bsb3RzX2xlZyA8LSBwbG90X2dyaWQoZmlndXJlNC41Yl9wbG90cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZ3VyZTQuNWJfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAwLjA1KSkKCmZpZ3VyZTQuNWJfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTdHVkeSA0OiBDaGlsZHJlbiwgNC01eSAoc2NvcmVkIHVzaW5nIGFkdWx0cycgc2NhbGVzKSIsIHNpemUgPSAxNiwgZm9udGZhY2UgPSAnYm9sZCcsIHggPSAwLCBoanVzdCA9IDApCgpmaWd1cmU0LjViX3Bsb3RzX2xlZ190aXRsZSA8LSBwbG90X2dyaWQoZmlndXJlNC41Yl90aXRsZSwgZmlndXJlNC41Yl9wbG90c19sZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDAuMTIsIDEpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA2LCBmaWcuYXNwID0gMC40fQpmaWd1cmU0LjViX3Bsb3RzX2xlZ190aXRsZQpgYGAKCiMjIyMjIFVzaW5nIGNoaWxkcmVuJ3Mgb3duIHNjYWxlcyAodGhyZWUtZmFjdG9yIHNvbHV0aW9uKQoKWFgKCmBgYHtyfQpwbG90c19kNF80Nl9zY29yZWRfNDZfcGFyIDwtIHJlbHZpel9mdW4oZDRfNDZfc2NvcmVkXzQ2X3BhciwgY29sb3JzID0gY29sb3JzMDIpCmBgYAoKYGBge3J9CmZpZ3VyZTQuNWNfcGxvdHMgPC0gcGxvdF9ncmlkKHBsb3RzX2Q0XzQ2X3Njb3JlZF80Nl9wYXJbWzFdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kNF80Nl9zY29yZWRfNDZfcGFyW1syXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfZDRfNDZfc2NvcmVkXzQ2X3BhcltbM11dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkExIiwgIkEyIiwgIkEzIiksIG5jb2wgPSAzKQoKZmlndXJlNC41Y19sZWcgPC0gZ2V0X2xlZ2VuZChwbG90c19kNF80Nl9zY29yZWRfNDZfcGFyW1sxXV0gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVfZmlsbF9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGNvbG9yczAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gOSkpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX2NvbG9yX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gY29sb3JzMDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSA5KSkpCiAgCmZpZ3VyZTQuNWNfcGxvdHNfbGVnIDwtIHBsb3RfZ3JpZChmaWd1cmU0LjVjX3Bsb3RzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlndXJlNC41Y19sZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDAuMDUpKQoKZmlndXJlNC41Y190aXRsZSA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoIlN0dWR5IDQ6IENoaWxkcmVuLCA0LTV5IChzY29yZWQgdXNpbmcgdGhlaXIgb3duIHNjYWxlcywgMy1mYWN0b3Igc29sdXRpb24pIiwgc2l6ZSA9IDE2LCBmb250ZmFjZSA9ICdib2xkJywgeCA9IDAsIGhqdXN0ID0gMCkKCmZpZ3VyZTQuNWNfcGxvdHNfbGVnX3RpdGxlIDwtIHBsb3RfZ3JpZChmaWd1cmU0LjVjX3RpdGxlLCBmaWd1cmU0LjVjX3Bsb3RzX2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMC4xMiwgMSkpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDYsIGZpZy5hc3AgPSAwLjR9CmZpZ3VyZTQuNWNfcGxvdHNfbGVnX3RpdGxlCmBgYAoKIyMjIyMgVXNpbmcgY2hpbGRyZW4ncyBvd24gc2NhbGVzIChmb3VyLWZhY3RvciBzb2x1dGlvbikKClhYCgpgYGB7cn0KcGxvdHNfZDRfNDZfc2NvcmVkXzQ2X3dkbSA8LSByZWx2aXpfZnVuKGQ0XzQ2X3Njb3JlZF80Nl93ZG0sIGNvbG9ycyA9IGNvbG9yczAyKQpgYGAKCmBgYHtyfQpmaWd1cmU0LjVkX3Bsb3RzIDwtIHBsb3RfZ3JpZChwbG90c19kNF80Nl9zY29yZWRfNDZfd2RtW1sxXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfZDRfNDZfc2NvcmVkXzQ2X3dkbVtbMl1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2Q0XzQ2X3Njb3JlZF80Nl93ZG1bWzNdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kNF80Nl9zY29yZWRfNDZfd2RtW1s0XV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfZDRfNDZfc2NvcmVkXzQ2X3dkbVtbNV1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2Q0XzQ2X3Njb3JlZF80Nl93ZG1bWzZdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJCMSIsICJCMiIsICJCMyIsICJCNCIsICJCNSIsICJCNiIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMykKCmZpZ3VyZTQuNWRfbGVnIDwtIGdldF9sZWdlbmQocGxvdHNfZDRfNDZfc2NvcmVkXzQ2X3dkbVtbMV1dICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX2ZpbGxfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjb2xvcnMwMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDkpKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV9jb2xvcl9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGNvbG9yczAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gOSkpKQogIApmaWd1cmU0LjVkX3Bsb3RzX2xlZyA8LSBwbG90X2dyaWQoZmlndXJlNC41ZF9wbG90cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZ3VyZTQuNWRfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAwLjA1KSkKCmZpZ3VyZTQuNWRfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTdHVkeSA0OiBDaGlsZHJlbiwgNC01eSAoc2NvcmVkIHVzaW5nIHRoZWlyIG93biBzY2FsZXMsIDQtZmFjdG9yIHNvbHV0aW9uKSIsIHNpemUgPSAxNiwgZm9udGZhY2UgPSAnYm9sZCcsIHggPSAwLCBoanVzdCA9IDApCgpmaWd1cmU0LjVkX3Bsb3RzX2xlZ190aXRsZSA8LSBwbG90X2dyaWQoZmlndXJlNC41ZF90aXRsZSwgZmlndXJlNC41ZF9wbG90c19sZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDAuMTIsIDEpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA2LCBmaWcuYXNwID0gMC43fQpmaWd1cmU0LjVkX3Bsb3RzX2xlZ190aXRsZQpgYGAKCiMjIyMgQW5hbHlzaXMgb2YgYXN5bW1ldHJpZXMKClhYCgojIyBEaXNjdXNzaW9uCgpYWAoKYGBge3J9CnNjYWxlc19zdHVkeTQgPC0gYmluZF9yb3dzKHNjYWxlc19lZmFfd2RtX2Q0X2FkICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoc3R1ZHkgPSAiQWR1bHRzIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlc19lZmFfcGFyX2Q0XzQ2ICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShzdHVkeSA9ICJDaGlsZHJlbiwgNC01eSAoMy1mYWN0b3Igc29sdXRpb24pIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlc19lZmFfd2RtX2Q0XzQ2ICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShzdHVkeSA9ICJDaGlsZHJlbiwgNC01eSAoNC1mYWN0b3Igc29sdXRpb24pIikpICU+JQogIHNlbGVjdCgtYyhsb2FkaW5nLCBvcmRlcikpICU+JQogIGRpc3RpbmN0KCkgJT4lCiAgbXV0YXRlKHN0dWR5ID0gZmFjdG9yKHN0dWR5LAogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJBZHVsdHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaGlsZHJlbiwgNC01eSAoMy1mYWN0b3Igc29sdXRpb24pIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hpbGRyZW4sIDQtNXkgKDQtZmFjdG9yIHNvbHV0aW9uKSIpKSkgJT4lCiAgc3ByZWFkKHN0dWR5LCBmYWN0b3IpICU+JQogIG11dGF0ZSh1cl9mYWN0b3IgPSBpZmVsc2UoIWlzLm5hKGBBZHVsdHNgKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgQWR1bHRzYCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShpcy5uYShgQ2hpbGRyZW4sIDQtNXkgKDMtZmFjdG9yIHNvbHV0aW9uKWApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBDaGlsZHJlbiwgNC01eSAoMy1mYWN0b3Igc29sdXRpb24pYCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgQ2hpbGRyZW4sIDQtNXkgKDQtZmFjdG9yIHNvbHV0aW9uKWApKSkgJT4lCiAgbGVmdF9qb2luKHNjYWxlc19lZmFfd2RtX2Q0X2FkICU+JSAKICAgICAgICAgICAgICBzZWxlY3QoY2FwYWNpdHksIG9yZGVyKSAlPiUgcmVuYW1lKG9yZGVyX2FkID0gb3JkZXIpKSAlPiUKICBhcnJhbmdlKHVyX2ZhY3Rvciwgb3JkZXJfYWQpICU+JQogIHNlbGVjdCgtYyh1cl9mYWN0b3IsIHN0YXJ0c193aXRoKCJvcmRlciIpKSkKYGBgCgpgYGB7cn0KdGFibGU0LjUgPC0gc2NhbGVzX3N0dWR5NCAlPiUKICBtdXRhdGVfYWxsKGFzLmNoYXJhY3RlcikgJT4lCiAgIyBkZWFsIHdpdGggQ2hpbGRyZW4sIDQtZmFjdG9yIHNvbHV0aW9uCiAgbXV0YXRlKHRlbXAxID0gYENoaWxkcmVuLCA0LTV5ICg0LWZhY3RvciBzb2x1dGlvbilgLAogICAgICAgICB0ZW1wMiA9IGdzdWIoIlxcKiIsICIiLCB0ZW1wMSksCiAgICAgICAgIHRlbXAzID0gY2FzZV93aGVuKAogICAgICAgICAgIHRlbXAyID09IGBBZHVsdHNgIH4gIuKckyIsCiAgICAgICAgICAgaXMubmEodGVtcDIpIH4gIiIsCiAgICAgICAgICAgVFJVRSB+IHRlbXAxKSkgJT4lCiAgbXV0YXRlKGBDaGlsZHJlbiwgNC01eSAoNC1mYWN0b3Igc29sdXRpb24pYCA9IHRlbXAzKSAlPiUKICBzZWxlY3QoLXN0YXJ0c193aXRoKCJ0ZW1wIikpICU+JQogICMgZGVhbCB3aXRoIENoaWxkcmVuLCAzLWZhY3RvciBzb2x1dGlvbgogIG11dGF0ZSh0ZW1wMSA9IGBDaGlsZHJlbiwgNC01eSAoMy1mYWN0b3Igc29sdXRpb24pYCwKICAgICAgICAgdGVtcDIgPSBnc3ViKCJcXCoiLCAiIiwgdGVtcDEpLAogICAgICAgICB0ZW1wMyA9IGNhc2Vfd2hlbigKICAgICAgICAgICB0ZW1wMiA9PSBgQWR1bHRzYCB+ICLinJMiLAogICAgICAgICAgIGlzLm5hKHRlbXAyKSB+ICIiLAogICAgICAgICAgIFRSVUUgfiB0ZW1wMSkpICU+JQogIG11dGF0ZShgQ2hpbGRyZW4sIDQtNXkgKDMtZmFjdG9yIHNvbHV0aW9uKWAgPSB0ZW1wMykgJT4lCiAgc2VsZWN0KC1zdGFydHNfd2l0aCgidGVtcCIpKSAlPiUKICBtdXRhdGVfYXQodmFycyhgQWR1bHRzYCksCiAgICAgICAgICAgIGZ1bnMoaWZlbHNlKGlzLm5hKC4pLCAiIiwgIuKckyIpKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoIllvdW5nZXIiKSksCiAgICAgICAgICAgIGZ1bnMoaWZlbHNlKGlzLm5hKC4pLCAiIiwgLikpKSAlPiUKICByZW5hbWUoQ2FwYWNpdHkgPSBjYXBhY2l0eSwKICAgICAgICAgYDMtZmFjdG9yIHNvbHV0aW9uYCA9IGBDaGlsZHJlbiwgNC01eSAoMy1mYWN0b3Igc29sdXRpb24pYCwKICAgICAgICAgYDQtZmFjdG9yIHNvbHV0aW9uYCA9IGBDaGlsZHJlbiwgNC01eSAoNC1mYWN0b3Igc29sdXRpb24pYCkgJT4lCiAga2FibGUoZm9ybWF0ID0gImh0bWwiLAogICAgICAgIGNhcHRpb24gPSAiVGFibGUgNC41OiBTY2FsZXMgZm9yIGVhY2ggb2YgdGhlIGNvbmNlcHR1YWwgdW5pdHMgKGZhY3RvcnMpIGlkZW50aWZpZWQgYnkgRUZBIGZvciBVUyBBZHVsdHMgYW5kIGNoaWxkcmVuIGluIFN0dWR5IDQgKHNlZSBDaGFwdGVyIElJSSkuIEZvciBjaGlsZHJlbiwgdGhpcyBpbmNsdWRlcyBzY2FsZXMgZm9yIGJvdGggdGhyZWUtIGFuZCBmb3VyLWZhY3RvciBFRkEgc29sdXRpb25zLiBBIGNoZWNrbWFyayBpbmRpY2F0ZXMgdGhhdCBhIG1lbnRhbCBjYXBhY2l0eSB3YXMgaW5jbHVkZWQgaW4gYSBzY2FsZSBmb3IgYSBwYXJ0aWN1bGFyIHNhbXBsZS4gVGhlIGNvbmNlcHR1YWwgdW5pdHMgb2YgeW91bmdlciBjaGlsZHJlbiBkaWZmZXJlZCBzdWJzdGFudGlhbGx5IGZyb20gdGhvc2Ugb2YgYWR1bHRzLCBzdWNoIHRoYXQgc29tZSBtZW50YWwgY2FwYWNpdGllcyB3ZXJlIGluY2x1ZGVkIGluIGRpZmZlcmVudCBzY2FsZXMgYWNyb3NzIGFnZSBncm91cHMgKGUuZy4sIGxvdmUgc29tZW9uZSB3YXMgcGFydCBvZiB0aGUgSEVBUlQgc2NhbGUgZm9yIGFkdWx0cywgYnV0IHBhcnQgb2YgdGhlIE1JTkQqIHNjYWxlIGluIHRoZSBmb3VyLWZhY3RvciBzb2x1dGlvbiBmb3IgeW91bmdlciBjaGlsZHJlbikuIEluIHRoZXNlIGNhc2VzLCB0aGUgbmFtZSBvZiB0aGUgc2NhbGUgaXMgcHJvdmlkZWQgKHJhdGhlciB0aGFuIGEgY2hlY2ttYXJrKS4iKSAlPiUKICBrYWJsZV9zdHlsaW5nKCkgJT4lCiAgZ3JvdXBfcm93cygiQk9EWSBzY2FsZSIsIDEsIDUpICU+JQogIGdyb3VwX3Jvd3MoIkhFQVJUIHNjYWxlIiwgNiwgMTApICU+JQogIGdyb3VwX3Jvd3MoIk1JTkQgc2NhbGUiLCAxMSwgMTUpICU+JQogIGFkZF9oZWFkZXJfYWJvdmUoYygiICIgPSAyLAogICAgICAgICAgICAgICAgICAgICAiQ2hpbGRyZW4sIDQtNXkiID0gMikpCmBgYAoKYGBge3IgdGFibGU0LjUsIGluY2x1ZGUgPSBUfQp0YWJsZTQuNQpgYGAKCmBgYHtyfQpwbG90c19hZ2VncF9kNF9zY29yZWRfYWQgPC0gcmVsdml6X2FnZWdwX2Z1bigKICBkX3Njb3JlZCA9IGQ0X2FkX3Njb3JlZF9hZCAlPiUgCiAgICBmdWxsX2pvaW4oZDRfNDZfc2NvcmVkX2FkKSwgCiAgYWdlX2dyb3VwcyA9IGMoImNoaWxkcmVuNDYiLCAiYWR1bHRzIiksCiAgYWdlX2dyb3VwX2xhYmVscyA9IGMoIkNoaWxkcmVuLCAoNC01eSkiLCAiQWR1bHRzIiksCiAgY29sb3JzID0gY29sb3JzMDIpCmBgYAoKYGBge3J9CmZpZ3VyZTQuNWFsbF9wbG90cyA8LSBwbG90X2dyaWQocGxvdHNfYWdlZ3BfZDRfc2NvcmVkX2FkW1sxXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfYWdlZ3BfZDRfc2NvcmVkX2FkW1syXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfYWdlZ3BfZDRfc2NvcmVkX2FkW1szXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiRDEiLCAiRDIiLCAiZDQiKSwgbmNvbCA9IDMpCgpmaWd1cmU0LjVhbGxfbGVnIDwtIGdldF9sZWdlbmQocGxvdHNfYWdlZ3BfZDRfc2NvcmVkX2FkW1sxXV0gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVfY29sb3JfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjb2xvcnMwMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS50cmFuc2xhdGUgPSBGLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMikpKQogIApmaWd1cmU0LjVhbGxfcGxvdHNfbGVnIDwtIHBsb3RfZ3JpZChmaWd1cmU0LjVhbGxfcGxvdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWd1cmU0LjVhbGxfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAwLjA1KSkKCmZpZ3VyZTQuNWFsbF90aXRsZSA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoIlRyYWNraW5nIGRldmVsb3BtZW50IGJldHdlZW4gNC01eSBhbmQgYWR1bHRob29kIChzY29yZWQgdXNpbmcgYWR1bHRzJyBzY2FsZXMpIiwgCiAgICAgICAgICAgICBzaXplID0gMTYsIGZvbnRmYWNlID0gJ2JvbGQnLCB4ID0gMCwgaGp1c3QgPSAwKQoKZmlndXJlNC41YWxsX3Bsb3RzX2xlZ190aXRsZSA8LSBwbG90X2dyaWQoZmlndXJlNC41YWxsX3RpdGxlLCBmaWd1cmU0LjVhbGxfcGxvdHNfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygwLjEyLCAxKSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNiwgZmlnLmFzcCA9IDAuNH0KZmlndXJlNC41YWxsX3Bsb3RzX2xlZ190aXRsZQpgYGAKCmBgYHtyfQpmaWd1cmU0LjYgPC0gcGxvdF9ncmlkKGZpZ3VyZTQuNWFfcGxvdHNfbGVnX3RpdGxlLCBmaWd1cmU0LjViX3Bsb3RzX2xlZ190aXRsZSwKICAgICAgICAgICAgICAgICAgICAgICBmaWd1cmU0LjVhbGxfcGxvdHNfbGVnX3RpdGxlLAogICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxKQoKZmlndXJlNC42X2NhcCA8LSBhZGRfc3ViKGZpZ3VyZTQuNiwgc3RyX3dyYXAoIkZpZ3VyZSA0LjY6IFJlbGF0aW9uc2hpcHMgYW1vbmcgVVMgYWR1bHRzJyBhbmQgY2hpbGRyZW4ncyBhdHRyaWJ1dGlvbnMgb2YgY29uY2VwdHVhbCB1bml0cyBpbiBTdHVkeSA0LCBzY29yZWQgdXNpbmcgYWR1bHRzJyBCT0RZLCBIRUFSVCwgYW5kIE1JTkQgc2NhbGVzIChzZWUgVGFibGUgNC41KS4gKEEpIEFkdWx0cy4gKEIpIENoaWxkcmVuICg0LTV5IG9mIGFnZSkuIChDKSBBIHZpc3VhbGl6YXRpb24gb2YgZGV2ZWxvcG1lbnQgYmV0d2VlbiA0LTV5IGFuZCBhZHVsdGhvb2QsIHVzaW5nIG1lYW4gc2NvcmVzIGJ5IGNoYXJhY3RlciBhbmQgYWdlIGdyb3VwLiBQbG90cyBhcmUgb3JnYW5pemVkIGJ5IHNhbXBsZSAocm93cykgYW5kIGJ5IHBhaXIgb2YgY29uY2VwdHVhbCB1bml0cyAoY29sdW1ucykuIEZvciBlYWNoIGNvbmNlcHR1YWwgdW5pdCwgc2NvcmVzIGNvdWxkIHJhbmdlIGZyb20gMC0xLiBJbiBwYW5lbHMgQS1CLCBpbmRpdmlkdWFsIHBhcnRpY2lwYW50cyBhcmUgcGxvdHRlZCBhcyBzbWFsbCwgdHJhbnNsdWNlbnQgY2lyY2xlcywgYW5kIG1lYW4gc2NvcmVzIGJ5IGNoYXJhY3RlciBhcmUgcGxvdHRlZCBhcyBsYXJnZXIsIHNvbGlkIGRpYW1vbmRzLiBFcnJvciBiYXJzIGFyZSA5NSUgYm9vdHN0cmFwcGVkIGNvbmZpZGVuY2UgaW50ZXJ2YWxzLiBUaGUgZG90dGVkIGxpbmUgY29ycmVzcG9uZHMgdG8gZXF1YWwgZW5kb3JzZW1lbnRzIG9mIHRoZSB0d28gY29uY2VwdHVhbCB1bml0cyBwbG90dGVkLiIsIDExMCksIHggPSAwLCBoanVzdCA9IDApCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBULCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMS40fQpnZ2RyYXcoZmlndXJlNC42X2NhcCkKYGBgCgpgYGB7cn0KZmlndXJlNC43IDwtIHBsb3RfZ3JpZChmaWd1cmU0LjVjX3Bsb3RzX2xlZ190aXRsZSwgZmlndXJlNC41ZF9wbG90c19sZWdfdGl0bGUsCiAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAyKSkKCmZpZ3VyZTQuN19jYXAgPC0gYWRkX3N1YihmaWd1cmU0LjcsIHN0cl93cmFwKCJGaWd1cmUgNC43OiBSZWxhdGlvbnNoaXBzIGFtb25nIFVTIGFkdWx0cycsIG9sZGVyIGNoaWxkcmVuJ3MsIGFuZCB5b3VuZ2VyIGNoaWxkcmVuJ3MgYXR0cmlidXRpb25zIG9mIGNvbmNlcHR1YWwgdW5pdHMgaW4gU3R1ZHkgMywgc2NvcmVkIHVzaW5nIHRoZWlyIG93biBzY2FsZXMgc2NhbGVzIChzZWUgVGFibGUgNC4zKS4gVHR3byBzZXRzIG9mIHNjb3JlcyBhcmUgcHJlc2VudGVkOiB1c2luZyBhIHRocmVlLWZhY3RvciBFRkEgc29sdXRpb24gKEExLUEzKSBhbmQgdXNpbmcgYSBmb3VyLWZhY3RvciBFRkEgc29sdXRpb24gKEIxLUI2KS4gUGxvdHMgYXJlIG9yZ2FuaXplZCBieSBzY2FsZSB1c2VkIChyb3dzKSBhbmQgYnkgcGFpciBvZiBjb25jZXB0dWFsIHVuaXRzIChjb2x1bW5zKS4gRm9yIGVhY2ggY29uY2VwdHVhbCB1bml0LCBzY29yZXMgY291bGQgcmFuZ2UgZnJvbSAwLTEuIEluZGl2aWR1YWwgcGFydGljaXBhbnRzIGFyZSBwbG90dGVkIGFzIHNtYWxsLCB0cmFuc2x1Y2VudCBjaXJjbGVzLCBhbmQgbWVhbiBzY29yZXMgYnkgY2hhcmFjdGVyIGFyZSBwbG90dGVkIGFzIGxhcmdlciwgc29saWQgZGlhbW9uZHMuIEVycm9yIGJhcnMgYXJlIDk1JSBib290c3RyYXBwZWQgY29uZmlkZW5jZSBpbnRlcnZhbHMuIFRoZSBkb3R0ZWQgbGluZSBjb3JyZXNwb25kcyB0byBlcXVhbCBlbmRvcnNlbWVudHMgb2YgdGhlIHR3byBjb25jZXB0dWFsIHVuaXRzIHBsb3R0ZWQuIiwgMTEwKSwgeCA9IDAsIGhqdXN0ID0gMCkKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IFQsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAxLjM1fQpnZ2RyYXcoZmlndXJlNC43X2NhcCkKYGBgCgoKIyBHZW5lcmFsIGRpc2N1c3Npb24KClhYCgoKIyBDaGFwdGVyIGNvbmNsdXNpb24KCkluIHRoaXMgY2hhcHRlciwgSSBleHBsb3JlZCBhIHNlY29uZCBhc3BlY3Qgb2YgY29uY2VwdHVhbCByZXByZXNlbnRhdGlvbnMgb2YgbWVudGFsIGxpZmUgYW1vbmcgVVMgY2hpbGRyZW4gYW5kIGFkdWx0czogVGhlIHJlbGF0aW9uc2hpcHMgYW1vbmcgY29uY2VwdHVhbCB1bml0cy4gU3R1ZGllcyAyLTQgYXJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgZm9sbG93aW5nIHRoZW9yeTogWFguIAoKQXMgaW4gQ2hhcHRlciBJSUksIEkgdXJnZSB0aGUgcmVhZGVyIHRvIHJlbWVtYmVyIHRoYXQgdGhpcyBpcyBub3QgdGhlIG9ubHkgcG9zc2libGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlIHBhdHRlcm4gb2YgcmVzdWx0cyBwcmVzZW50ZWQgaGVyZTsgYWRkaXRpb25hbCBzdHVkaWVz4oCUaW4gcGFydGljdWxhciwgc3R1ZGllcyBkZXNpZ25lZCB0byB0ZXN0IHRoZSBoeXBvdGhlc2lzIHRoYXQgWFjigJQgY291bGQgcHJvdmlkZSBjb252ZXJnaW5nIGV2aWRlbmNlIG9yIGNvdWxkIGNoYWxsZW5nZSB0aGlzIHRoZW9yZXRpY2FsIGludGVycHJldGF0aW9uLiBJbnN0ZWFkLCB0aGUgcHJpbWFyeSByb2xlIG9mIHRoZSByZS1hbmFseXNpcyBkaXNjdXNzZWQgaGVyZSBoYXMgYmVlbiB0byBpbnNwaXJlIHRoZSBoeXBvdGhlc2lzIHN0YXRlZCBpbiB0aGUgcHJldmlvdXMgcGFyYWdyYXBoIGFuZCB0byB0aGUgZm91bmRhdGlvbiBmb3IgZnV0dXJlIHRlc3RzIG9mIHRoaXMgaHlwb3RoZXNpcywgaW4gdHVybiByZWZpbmluZyBhIGdlbmVyYWwgdGhlb3J5IG9mIHRoaXMgYXNwZWN0IG9mIGNvbmNlcHR1YWwgZGV2ZWxvcG1lbnQuICAKCkluIHRoZSBuZXh0IGNoYXB0ZXIsIEkgYXBwbHkgdGhlIHNhbWUgZXhwbG9yYXRvcnkgc3Bpcml0IHRvIHRoZSB0aGlyZCBhbmQgZmluYWwgYXNwZWN0IG9mIGNvbmNlcHR1YWwgcmVwcmVzZW50YXRpb25zIG9mIG1lbnRhbCBsaWZlOiB0aGUgYXBwbGljYXRpb24gb3IgZGVwbG95bWVudCBvZiB0aGVzZSBjb25jZXB0dWFsIHVuaXRzIGluIHJlYXNvbmluZyBhYm91dCB2YXJpb3VzIGtpbmRzIG9mIGJlaW5ncy4K